首页 > 代码库 > 于TCP协议的socket通信

于TCP协议的socket通信

基于TCP协议Socket服务端和客户端的通信模型:

 

                                        技术分享

Socket通信步骤:

  1.建立服务端ServerSocket和客户端Socket

  2.打开连接到Socket的输出输入流

  3.按照协议进行读写操作

  4.关闭相对应的资源

多线程服务器

多线程用来实现 服务器与多客户端之间的通信

基本步骤

  1 服务器创建serverSocket,循环调用accept()等待客户端连接

  2 客户端创建一个scoket并请求和服务器端连接

  3 服务器端接收客户端请求,创建socket与该客户建立专线连接

  4 建立连接的连个socket在一个单独的线程上对话

  5 服务器继续等待新的连接

客户端

 1 package com.socket; 2  3 import java.io.BufferedReader; 4 import java.io.InputStream; 5 import java.io.InputStreamReader; 6 import java.io.OutputStream; 7 import java.io.PrintWriter; 8 import java.net.Socket; 9 10 public class Client {11 12     /**13      * 基于TCP协议的socket通信14      * 客户端15      * @return16      */17     public static void main(String[] args) {18         19         try {20             //指定服务地址和端口号21             Socket socket=new Socket("localhost", 8888);22             //2.获取输出流,向服务器端发送信息     字节流23             OutputStream op = socket.getOutputStream();24             //将输出流包装为打印流25             PrintWriter ps = new PrintWriter(op);26             ps.write("用户名 client 密码 123 ");27             ps.flush();28             //关闭输出流29             socket.shutdownOutput();30             31             //从服务器获取输入流32             InputStream is = socket.getInputStream();33             BufferedReader bf = new BufferedReader(new InputStreamReader(is));34             String info = null;35             36             while((info=bf.readLine())!=null){37                 System.out.println("服务器说"+info);38             }39             40             //关闭资源41             socket.close();42         } catch (Exception e) {43             // TODO Auto-generated catch block44             e.printStackTrace();45         }46     }47 48 }

服务器端

 1 package com.socket; 2  3  4 import java.io.IOException; 5 import java.net.InetAddress; 6 import java.net.ServerSocket; 7 import java.net.Socket; 8  9 public class Server {10 11     /**12      * 基于TCP协议的Socket编程13      *     服务器端14      * @return15      */16     public static void main(String[] args) {17         18         int count = 0;19         try {20             //1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口21             ServerSocket serverSocket = new ServerSocket(8888);22             //循环监听客户端连接23             while(true){24                 // 调用accept()方法开始监听,等待客户端的连接25                 Socket     socket=serverSocket.accept();26                 SocketThread st = new SocketThread(socket);27                 28                 st.start();29                 count++;30                 System.out.println("当前客户数量: "+count);31                 32                 InetAddress address=socket.getInetAddress();33                 34                 System.out.println("当前客户端ip"+address);35             }36             37             38         } catch (IOException e) {39             40             e.printStackTrace();41         }42         43         44     }45 46 }

服务器端线程类

 1 package com.socket; 2  3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 import java.io.OutputStream; 8 import java.io.PrintWriter; 9 import java.net.Socket;10 11 public class SocketThread extends Thread {12 13     /**14      * 循环接收客户端线程15      * 16      * @return17      */18     // 和本线程相关的Socket19     Socket socket = null;20     public SocketThread(Socket socket) {21         this.socket = socket;22     }23 24     @Override25     public void run() {26 27         InputStream is = null;28         OutputStream os = null;29         BufferedReader bs = null;30         PrintWriter pw = null;31         try {32             is = socket.getInputStream();33 34             bs = new BufferedReader(new InputStreamReader(is));35             String info = null;36             while ((info = bs.readLine()) != null) {37 38                 System.out.println("我是服务器    客户端 说 " + info);39             }40             socket.shutdownInput();41 42             // 相应客户端信息43             os = socket.getOutputStream();44             pw = new PrintWriter(os);45             pw.print("你好,欢迎登陆");46             pw.flush();47         } catch (IOException e) {48             // TODO Auto-generated catch block49             e.printStackTrace();50         } finally {51 52             try {53                 if (os != null)54                     os.close();55                 if (is != null)56                     is.close();57                 if (bs != null)58                     bs.close();59                 if (pw != null)60                     pw.close();61                 if (socket != null)62                     socket.close();63             } catch (IOException e) {64                 // TODO Auto-generated catch block65                 e.printStackTrace();66             }67 68         }69     }70 71 }

 

于TCP协议的socket通信