Java Socket--TCP编程实例

来源:互联网 发布:淘宝供销怎么改分销 编辑:程序博客网 时间:2024/06/05 19:35
服务器端:
1:创建ServerSocket对象,绑定监听端口
2:通过accept()方法监听客户端请求
3:连接建立后。通过输入流InputStream读取客户端的请求信息
4:通过输入流向客户端发送响应信息
5:关闭相关资源
客户端:
1:创建Socket对象,指明需要连接的服务器的地址和端口号
2:连接建立后,通过输出流向服务器端发送请求信息
3:通过输入流获取服务器响应的信息

4:关闭资源


服务器端:::

package TCP;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;public class Service1 {public static void main(String[] args) throws IOException {// TODO Auto-generated method stub//第一步 :建立服务器端serverSocket        ServerSocket service=new ServerSocket(8888);        Socket socket=null;        System.out.println("服务器端正在等待客户端响应!!!");        //第二步:监听此端口 ,并返回一个Socket         socket=service.accept();        //第三步:获取输入流  通过输入流读取客户端请求        InputStream is=socket.getInputStream();        InputStreamReader isr=new InputStreamReader(is);        BufferedReader br=new BufferedReader(isr);        String info=null;        while((info=br.readLine())!=null){        System.out.println("服务器端接收客户端的数据为:"+info);        }        socket.shutdownInput();     /*      * ----------------------      * 响应客户端请求      */      OutputStream os=socket.getOutputStream();        PrintWriter pw=new PrintWriter(os);        pw.write("欢迎你:小伙子");        pw.flush();        pw.close();        os.close();                        br.close();        isr.close();        is.close();        socket.close();        service.close();        }}

客户端:::

package TCP;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;public class Client1 {public static void main(String[] args) throws UnknownHostException, IOException {// TODO Auto-generated method stub//第一步:创建socket指明需要接收的的端口和主机      Socket socket=new Socket("localhost",8888);      //第二步:通过输出流发送请求      OutputStream os=socket.getOutputStream();      PrintWriter pw=new PrintWriter(os);      pw.write("用户名:admin 密码:123");      pw.flush();           socket.shutdownOutput();            /*       * --------       * 获取服务器端响应信息       */         InputStream is=socket.getInputStream();     BufferedReader br=new BufferedReader(new InputStreamReader(is));           String info=null;         while((info=br.readLine())!=null){         System.out.println("服务器响应说:"+info);         }       is.close();       br.close();       pw.close();       os.close();       socket.close();             }}
注意:

资源的关闭:打开的顺序和关闭的顺序是相反的   最先打开什么  最后关闭什么 不然容易出现connection reset等错误

PrintWriter输出流必须flush一下  不然在服务器端看不到输出流的字符串

先启动服务器端  再启动客户端

socket,getInputStream /outputStream获取的是字节流


如何用多线程实现一个服务器端   多个客户端::::

服务器端::

package TCP;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;public class Service1 {public static void main(String[] args) throws IOException {// TODO Auto-generated method stub//第一步 :建立服务器端serverSocket        ServerSocket service=new ServerSocket(8888);        Socket socket=null;        System.out.println("服务器端正在等待客户端响应!!!");       int count=0;       while(true){       //第二步:监听此端口 ,并返回一个Socket        socket=service.accept();       SocketThread1 socketthread=new SocketThread1(socket);       socketthread.start();       count++;       System.out.println("客户端的数量:"+count);InetAddress address=socket.getInetAddress();System.out.println("当前客户端的IP:"+address.getHostAddress());       }                }}

客户端:::

package TCP;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;public class Client1 {public static void main(String[] args) throws UnknownHostException, IOException {// TODO Auto-generated method stub//第一步:创建socket指明需要接收的的端口和主机      Socket socket=new Socket("localhost",8888);      //第二步:通过输出流发送请求      OutputStream os=socket.getOutputStream();      PrintWriter pw=new PrintWriter(os);      pw.write("用户名:admin 密码:123");      pw.flush();           socket.shutdownOutput();            /*       * --------       * 获取服务器端响应信息       */         InputStream is=socket.getInputStream();     BufferedReader br=new BufferedReader(new InputStreamReader(is));           String info=null;         while((info=br.readLine())!=null){         System.out.println("服务器响应说:"+info);         }       is.close();       br.close();       pw.close();       os.close();       socket.close();             }}


线程处理类:::

package TCP;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.Socket;public class SocketThread1 extends Thread{private Socket socket=null;public SocketThread1(Socket socket){this.socket=socket;}public void run(){InputStream is=null; BufferedReader br=null; InputStreamReader isr=null; OutputStream os=null; PrintWriter pw=null;try {is = socket.getInputStream();            isr=new InputStreamReader(is);               br=new BufferedReader(isr);        String info=null;        while((info=br.readLine())!=null){        System.out.println("服务器端接收客户端的数据为:"+info);        }        socket.shutdownInput();     /*      * ----------------------      * 响应客户端请求      */       os=socket.getOutputStream();        pw=new PrintWriter(os);        pw.write("欢迎你:小伙子");             pw.flush();        pw.close();        os.close();                        br.close();        isr.close();        is.close();        socket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally{//关闭资源try {if(pw!=null)pw.close();if(os!=null)os.close();if(br!=null)br.close();if(isr!=null)isr.close();if(is!=null)is.close();if(socket!=null)socket.close();} catch (IOException e) {e.printStackTrace();}}}}

多启动几个客户端就可以查看效果