使用多线程监听多客户端

发表时间:2017-05-09 13:59:47 浏览量( 42 ) 留言数( 0 )

学习目标:

1、了解Java的历史

2、为什么要学习Java语言

3、端正学习态度


学习过程:

上一节的中我们只是实现了一次通讯,下面我们要做的例子可以允许多个客户机,多次发送信息给服务器。

一、思路

要实现这个功能,服务器需要不断的等待新的客户机连接,每一个新的客户机连接,我们就启动一个新的线程来维护与当前的客户机的socket连接,客户输入“bye”是,这个客户就退出。如果你忘记了线程,最好先回去复习一下。思路图如下:

attcontent/c0346ac1-d838-42a1-86f3-eeed7d140d7f.png

二、实现代码

1、与客户端对应的线程类。实现代码如下:

 /**
 * 与每一个客户端对应的线程
 * 
 * @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、服务端代码。

 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、客户端代码。

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控制台。

也是先编译,然后启动服务类:

attcontent/cc41c7ac-37d6-4210-b96c-f27865605248.png

这时候你可以多打开几个Dos控制台运行客户机类。

attcontent/2199021d-4997-44dd-9119-33b3baaa00ca.png

这节课的内容比较需要好好理解,为明天我们做一个多人聊天系统做好准备,希望大家先把这节课的内容好好理解后,再看明天的内容。