《JAVA通信(一)——输入数据到客户端》
《JAVA通信(二)——实现客户端和服务器的通信》
前面我们是已经实现了客户端和服务器的通信,但是还存在着一个问题,那就是服务器一次只能跟一个客户端通信。通俗讲就是你使用QQ时一次只能和一个人聊天。今天我们继续完善一下这个通信程序,实现多人聊天。
一、多线程
如果我们要实现多人聊天,那么我们就必须为每一个客户机创建一个线程。这个线程用来处理服务器和当前客户机的通信。过程图如下:
二、具体代码
在前面两篇博客的代码基础我们对其进行改进,使其成为一个多线程的程序。
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);
}
}
三、命令行运行结果
从运行结果我们会发现程序已经可以进行多人聊天了~