黑马程序员技术交流社区

标题: 循序渐进Java Socket网络编程-3 [打印本页]

作者: pi408637535    时间: 2015-7-14 16:58
标题: 循序渐进Java Socket网络编程-3
六、多客户端连接服务器

上面的服务器端程序一次只能连接一个客户端,这在实际应用中显然是不可能的。通常的网络环境是多个客户端连接到某个主机进行通讯,所以我们要对上面的程序进行改造。

设计思路:服务器端主程序监听某一个端口,客户端发起连接请求,服务器端主程序接收请求,同时构造一个线程类,用于接管会话。当一个Socket会话产生后,这个会话就会交给线程进行处理,主程序继续进行监听。

下面的实现程序流程是:客户端和服务器建立连接,客户端发送消息,服务端根据消息进行处理并返回消息,若客户端申请关闭,则服务器关闭此连接,双方通讯结束。

客户端程序:
  1. package sock;

  2. import java.io.BufferedReader;
  3. import java.io.InputStreamReader;
  4. import java.io.PrintWriter;
  5. import java.net.Socket;
  6.   
  7. public class SocketClient {
  8.     public static void main(String[] args) {
  9.         try {
  10.             Socket socket =new Socket("127.0.0.1",2013);
  11.             socket.setSoTimeout(60000);
  12.   
  13.             PrintWriter printWriter =new PrintWriter(socket.getOutputStream(),true);
  14.             BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(socket.getInputStream()));
  15.               
  16.             String result ="";
  17.             while(result.indexOf("bye") == -1){
  18.                 BufferedReader sysBuff =new BufferedReader(new InputStreamReader(System.in));
  19.                 printWriter.println(sysBuff.readLine());
  20.                 printWriter.flush();
  21.                   
  22.                 result = bufferedReader.readLine();
  23.                 System.out.println("Server say : " + result);
  24.             }
  25.   
  26.             printWriter.close();
  27.             bufferedReader.close();
  28.             socket.close();
  29.         }catch (Exception e) {
  30.             System.out.println("Exception:" + e);
  31.         }
  32.     }
  33. }
复制代码


服务器端程序:
  1. package sock;
  2. import java.io.*;
  3. import java.net.*;
  4.   
  5. public class Server extends ServerSocket {
  6.     private static final int SERVER_PORT =2013;
  7.   
  8.     public Server()throws IOException {
  9.         super(SERVER_PORT);
  10.   
  11.         try {
  12.             while (true) {
  13.                 Socket socket = accept();
  14.                 new CreateServerThread(socket);//当有请求时,启一个线程处理
  15.             }
  16.         }catch (IOException e) {
  17.         }finally {
  18.             close();
  19.         }
  20.     }
  21.   
  22.     //线程类
  23.     class CreateServerThread extends Thread {
  24.         private Socket client;
  25.         private BufferedReader bufferedReader;
  26.         private PrintWriter printWriter;
  27.   
  28.         public CreateServerThread(Socket s)throws IOException {
  29.             client = s;
  30.   
  31.             bufferedReader =new BufferedReader(new InputStreamReader(client.getInputStream()));
  32.               
  33.             printWriter =new PrintWriter(client.getOutputStream(),true);
  34.             System.out.println("Client(" + getName() +") come in...");
  35.               
  36.             start();
  37.         }
  38.   
  39.         public void run() {
  40.             try {
  41.                 String line = bufferedReader.readLine();
  42.   
  43.                 while (!line.equals("bye")) {
  44.                     printWriter.println("continue, Client(" + getName() +")!");
  45.                     line = bufferedReader.readLine();
  46.                     System.out.println("Client(" + getName() +") say: " + line);
  47.                 }
  48.                 printWriter.println("bye, Client(" + getName() +")!");
  49.                   
  50.                 System.out.println("Client(" + getName() +") exit!");
  51.                 printWriter.close();
  52.                 bufferedReader.close();
  53.                 client.close();
  54.             }catch (IOException e) {
  55.             }
  56.         }
  57.     }
  58.   
  59.     public static void main(String[] args)throws IOException {
  60.         new Server();
  61.     }
  62. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2