学习目标:
1、结合服务器端多线程处理客户端连接
学习过程:
上一节的中我们只是实现了一次通讯,下面我们要做的例子可以允许多个客户机,多次发送信息给服务器。
一、思路
要实现这个功能,服务器需要不断的等待新的客户机连接,每一个新的客户机连接,我们就启动一个新的线程来维护与当前的客户机的socket连接,客户输入“bye”是,这个客户就退出。如果你忘记了线程,最好先回去复习一下。思路图如下:
二、实现代码
1、与客户端对应的线程类。实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | /** * 与每一个客户端对应的线程 * * @author Administrator * */ public class SocketThread extends Thread { private Socket socket; //对应的socket private String name; private BufferedReader in; private PrintWriter pw; public SocketThread(String name, Socket socket) { this .name = name; this .socket = socket; try { in = new BufferedReader( new InputStreamReader( socket.getInputStream())); pw = new PrintWriter( new BufferedWriter( new OutputStreamWriter( socket.getOutputStream()))); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void run() { pw.println( "欢迎:" +name); pw.flush(); try { String temp = in.readLine(); while ( true ) { System.out.println( "客户端发来的信息:" + temp); temp = in.readLine(); if (temp.equals( "bye" )) { break ; } } in.close(); pw.flush(); pw.close(); socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
2、服务端代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class Server { public static void main(String[] args) throws IOException { // 构造服务器端的soucket,监听端口 ServerSocket serverSocket = new ServerSocket( 6001 ); System.out.println( "服务器启动,等待客户端的链接..." ); // 程序在此定下来,等待客户端的链接 int i= 0 ; //不断等待客户端的链接 while ( true ){ Socket socket = serverSocket.accept(); i++; //启动一个线程, SocketThread socketThread= new SocketThread (socket.getInetAddress().getHostName()+ ":" +i, socket); socketThread.start(); } } } |
3、客户端代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | public class Client { public static void main(String[] args) throws UnknownHostException, IOException { // 指定ip和端口 Socket socket = new Socket(InetAddress.getByName( "192.168.11.144" ), 6001 ); // 接受服务器发来的信息 BufferedReader br = new BufferedReader( new InputStreamReader( socket.getInputStream())); System.out.println( "服务端发来的信息:" + br.readLine()); // 发送一条信息给服务器 PrintWriter pw = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream()))); pw.println( "liu" ); pw.flush(); Scanner scanner = new Scanner(System.in); String temp = null ; while ( true ) { System.out.print( "说话:" ); temp = scanner.next(); pw.println(temp); pw.flush(); if (temp.equals( "bye" )) { break ; } } pw.close(); socket.close(); } } |
4、测试。
把所有的类复制到D:盘中,使用Dos控制台,服务器使用一个控制台,每一个客户端一个Dos控制台。
也是先编译,然后启动服务类:
这时候你可以多打开几个Dos控制台运行客户机类。
这节课的内容比较需要好好理解,为明天我们做一个多人聊天系统做好准备,希望大家先把这节课的内容好好理解后,再看明天的内容。