📄 multicliserver.java
字号:
import java.io.*;
import java.net.*;
/**类MultiCliServer是多客户的服务器端程序,该程序通过线程实现多客户通信机制*/
public class MultiCliServer{
/*整型变量clientnum表示客户端的个数*/
static int clientnum = 0;
public static void main(String args[])throws IOException{
/*声明一个ServerSocket对象,初始值为null*/
ServerSocket serverSocket = null;
/*声明一个布尔变量existClient,用于表示端口处有无客户端的访问*/
boolean existClient = true;
/*由于ServerSocket的生成和关闭都有可能产生错误,因此需要进行例外处理*/
try{
try{
/*生成serverSocket对象,该对象负责监听端口4700*/
serverSocket=new ServerSocket(4700);
}catch(IOException e) {
System.out.println("对不起,不能监听端口:4700.");
System.exit(-1);
}
/*对机器的4700端口进行监听,看是否有客户端的socket连接*/
while(existClient)
{
/*如果有客户端的socket连接,就生成ServerThread类的对象,也就是新生成一个线程对象,以进行输入流、输出流生成以及数据的读取操作*/
ServerThread threadObj = new ServerThread(serverSocket.accept(),clientnum);
/*启动threadObj线程对象,执行线程对象中的run()方法*/
threadObj.start();
/*将客户端的数目加1*/
clientnum++;
}
/*将服务器的socket关闭*/
serverSocket.close();
}catch(IOException e){}
}
}
/**类ServerThread是Thread的子类,用于创建一个线程对象来实现一个客户端和服务器端的通信*/
class ServerThread extends Thread{
/*生成一个Socket对象,初始值为null*/
Socket clientSocket = null;
/*声明一个静态整型变量clientnum*/
int clientnum;
/*构造方法对上面的对象和变量赋值*/
public ServerThread(Socket socket,int num) {
clientSocket=socket;
/*每生成一个线程,客户端数目就加1*/
clientnum=num+1;
}
/*方法run()实现输入流、输出流的创建以及数据的读取和输出*/
public void run() {
/*由于socket的生成和关闭都有可能产生错误,因此需要进行例外处理*/
try{
/*声明一个字符串变量,用于存放读取的一行数据*/
String lineStr;
/*通过socket对象的getInputStream()方法获得输入流,将它赋给inObj对象*/
InputStream inObj = clientSocket.getInputStream();
/*根据上面的InputStream类对象inObj生成InputStreamReader类的对象streamObj1*/
InputStreamReader streamObj1 = new InputStreamReader(inObj);
/*根据streamObj1生成BufferedReader类的对象buffObj1,以提高数据读取效率*/
BufferedReader buffObj1 = new BufferedReader(streamObj1);
/*获得socket的输出流,将它赋给OutputStream类的对象putObj*/
OutputStream putObj = clientSocket.getOutputStream();
/*根据获得的输出流创建PrintWriter类对象outObj,用于输出信息*/
PrintWriter outObj = new PrintWriter(putObj);
/*生成一个InputStreamReader对象,对应键盘的输入*/
InputStreamReader streamObj2 = new InputStreamReader(System.in);
/*根据上面的streamObj2输入流创建BufferedReader类的对象,以提高数据读取效率*/
BufferedReader buffObj2 = new BufferedReader(streamObj2);
/*输出客户端的输入信息*/
System.out.println("Client "+clientnum+ ":" + buffObj1.readLine());
/*读取服务器端键盘输入的数据,放在字符串lineStr中*/
lineStr = buffObj2.readLine();
/*判断服务器端输入的字符串是不是“end”,如果不是就进行循环*/
while(!lineStr.equals("end"))
{
/*将服务器端输入的字符串通过socket在客户端输出*/
outObj.println(lineStr);
/*在客户端强制输出服务器端输入的字符串*/
outObj.flush();
/*在服务器端输出自己这端键盘输入的字符串*/
System.out.println("Server:"+lineStr);
/*在服务器端输出客户端输入的信息*/
System.out.println("Client "+ clientnum + ":" +buffObj1.readLine());
/*将服务器端键盘输入的信息放在字符串变量lineStr中*/
lineStr = buffObj2.readLine();
}
/*关闭输出流*/
outObj.close();
/*关闭输入流*/
buffObj1.close();
/*关闭socket*/
clientSocket.close();
}catch(Exception e) {
System.out.println("错误:"+e);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -