运行课本例15.4的支持多客户的TCP socket套接字C/S程序。
客户端的代码同上(聊天器第一版),服务器端采用多线程的方法,服务器不断监听客户连接请求,一旦收到新的客户请求,创建新的线程专门处理客户请求。
服务器端的主线程:
import java.io.*;
import java.net.*;
public class MultiTalkServer{
static int clientnum=0; //静态成员变量,记录当前客户的个数
public static void main(String args[]) throws IOException {
ServerSocket serverSocket=null;
boolean listening=true;
try{
//创建一个ServerSocket在端口4700监听客户请求
serverSocket=new ServerSocket(4700);
}catch(IOException e) {
System.out.println("Could not listen on port:4700.");
System.exit(-1); //退出
}
while(listening){ //循环监听
//监听到客户请求,根据得到的Socket对象和客户计数创建服务线程,并启动之
new ServerThread(serverSocket.accept(),clientnum).start();
clientnum++; //增加客户计数
}
serverSocket.close(); //关闭ServerSocket
}
}
处理客户请求线程:
import java.io.*;
import java.net.*;
public class ServerThread extends Thread{
Socket socket=null; //保存与本线程相关的Socket对象
int clientnum; //保存本线程的客户计数
public ServerThread(Socket socket,int num) { //构造函数
this.socket=socket; //初始化socket变量
clientnum=num+1; //初始化clientnum变量
}
public void run() { //线程主体
try{
String line;
BufferedReader is=new BufferedReader(new
InputStreamReader(socket.getInputStream()));
PrintWriter os=new PrintWriter(socket.getOutputStream());
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
System.out.println("Client:"+ clientnum +is.readLine());
line=sin.readLine();
while(!line.equals("bye")){//如果该字符串为 "bye",则停止循环
os.println(line);//向客户端输出该字符串
os.flush();//刷新输出流,使Client马上收到该字符串
System.out.println("Server:"+line);
System.out.println("Client:"+ clientnum +is.readLine());
line=sin.readLine();//从系统标准输入读入一字符串
}//继续循环
os.close(); //关闭Socket输出流
is.close(); //关闭Socket输入流
socket.close(); //关闭Socket
}catch(Exception e){
System.out.println("Error:"+e);//出错,打印出错信息
}
}
}}
a. 在本机上建立Java工程,启动一个服务端程序,启动两个客户端程序,在控制台输入聊天消息,体验支持多客户端的客户端/服务端聊天对话过程。
运行结果:启动一个服务器端,两个客户端
b.修改客户端套接字连接的服务器地址,在两台不同的机子上分别运行客户端、一台机子上运行服务端程序,在各机的控制台输入聊天消息,体验不同机器上多客户端/服务端聊天对话过程。
将客户端的IP地址是另一台电脑的IP地址。一个设置为192.168.1.103,另一个设置为192.168.1.105
运行结果同上