《JAVA通信(一)——输入数据到客户端》

《JAVA通信(二)——实现客户端和服务器的通信》

前面我们是已经实现了客户端和服务器的通信,但是还存在着一个问题,那就是服务器一次只能跟一个客户端通信。通俗讲就是你使用QQ时一次只能和一个人聊天。今天我们继续完善一下这个通信程序,实现多人聊天。

一、多线程

如果我们要实现多人聊天,那么我们就必须为每一个客户机创建一个线程。这个线程用来处理服务器和当前客户机的通信。过程图如下:

java聊天 源代码 java实现聊天_服务器与客户端

 

二、具体代码

在前面两篇博客的代码基础我们对其进行改进,使其成为一个多线程的程序。

package communicatetest3;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

//定义一个通信类
public class ServerThread extends Thread {
	OutputStream output;//输出流
	InputStream input;//输入流
	Socket socket;//定义一个socket接收对象的属性
	
	//线程创建方法
	public void run() {
		try {		
			System.out.println("已启动一个线程来处理~");
			
			//为输入输出流赋值
			output=socket.getOutputStream();
			input=socket.getInputStream();
			//开始通信
			//传送信息给客户机
			String outS="Hello,welcome to my ServerSocket!\r\n";
			out(outS);
			
			//发送信息给服务器
			ReadString();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	//定义一个建立服务器的方法
	private void setUpServer(int port) throws IOException {
		//将输入的端口设置为服务器
		ServerSocket server=new ServerSocket(port);
		//输出当前服务器的端口号
		System.out.println("服务器创建成功,端口号:"+server.getLocalPort());
		while(true) {
			ServerThread ts=new ServerThread();
			//为对象的socket属性赋值。
			ts.socket=server.accept();
			//启动线程
			ts.start();
		}
	}	
	
	//定义一个输出信息到客户机的方法
	private void out(String outS) throws IOException {
		//将字符串转化为byte数组
		byte[] dataout=outS.getBytes();
		//调用write()将信息发送客户机
		output.write(dataout);
		//强制输出到命令行的界面中
		output.flush();
	}

	//定义一个传送字符串给服务器的方法
	public void ReadString() throws IOException {
		String inputS="";
		while(!inputS.equals("bye")) {
			//读取第一个字符
			int AsciiNumber=input.read();
			while(AsciiNumber!=13) {
				//将ascii码转化为相应的char型字符
				inputS+=(char)AsciiNumber;
				//接收下一个字符
				AsciiNumber=input.read();
			}
			System.out.println(inputS);
		}
		//关闭连接
		output.close();
	}
	
	//主函数入口
	public static void main(String[] args) throws IOException {
		//创建一个通信类的对象
		ServerThread server=new ServerThread();
		server.setUpServer(9014);
	}

}

三、命令行运行结果

java聊天 源代码 java实现聊天_JAVA通信_02

从运行结果我们会发现程序已经可以进行多人聊天了~