📄 chatmulticliserver.java
字号:
import java.io.*;
import java.net.*;
public class ChatMultiCliServer
//类MultiCliServer是多客户的服务器端程序,该程序通过线程实现多客户通信机制
{
static int clientnumber = 0;
//整型变量clientnumber表示客户端的个数
public static void main(String args[]) throws IOException
{
ServerSocket serversocket = null;
//声明一个ServerSocket对象,初始值为null
boolean clientexist = true;
//声明一个布尔变量clientexist,用于表示端口处有无客户端的访问
try
//由于ServerSocket的生成和关闭都可能产生错误,因此需要进行异常处理
{
try
{
serversocket = new ServerSocket(60000);
//生成serversocket对象,该对象负责监听端口60000;
System.out.println("This is Server. And The Server is all set!");
}
catch(IOException e)
{
System.out.println("Sorry! You have no right to monitor port 60000!");
System.exit(-1);
}
while(clientexist)
//对机器的60000端口进行监听,看是否有客户端的socket连接
{
ServerThread threadobject = new ServerThread(serversocket.accept(), clientnumber);
//如果有客户端的socket连接,就生成ServerThread类的对象,也就是新生成一个线程对象,以进行输入流、输出流生成以及数据的读取操作
threadobject.start();
//启动threadobject线程对象,执行线程对象中的run()方法
clientnumber++;
//将客户端的数目加1
}
serversocket.close();
//将服务器的socket关闭
}
catch(IOException e)
{
}
}
}
class ServerThread extends Thread
//类ServerThread是Thread的子类,用于创建一个线程对象来实现一个客户端和服务器的通信
{
Socket clientsocket = null;
//生成一个Socket对象,初始值为null
int clientnumber;
//声明一个静态整形变量clientnumber
public ServerThread(Socket clisocket, int number)
//构造方法对上面的对象和变量赋值
{
clientsocket = clisocket;
clientnumber = number + 1;
//每生成一个线程,客户端数目就加1
}
public void run()
{
try
//由于clisocket的生成和关闭都有可能产生错误,因此需要进行异常处理
{
String readlinestring;
//声明一个字符串变量,用于存放读取的一行数据
InputStream inputobject = clientsocket.getInputStream();
//通过clisocket对象的getInputStream()方法获得输入流,将它赋给inputobject对象
InputStreamReader streamobject1 = new InputStreamReader(inputobject);
//根据上面的InputStream类对象inputobject生成InputStreamReader类的对象streamobject1
BufferedReader bufferobject1 = new BufferedReader(streamobject1);
//根据streamobject1生成BufferedReader类的对象bufferobject1,以提高数据读取效率
OutputStream outputobject = clientsocket.getOutputStream();
//获得clisocket的输出流,将它赋值给OutputStream类的对象outputobject
PrintWriter outputstream = new PrintWriter(outputobject);
//根据获得的输出流创建PrintWriter类对象outputstream,用于输出信息
InputStreamReader streamobject2 = new InputStreamReader(System.in);
//生成一个InputStreamReader对象,对应键盘的输入
BufferedReader bufferobject2 = new BufferedReader(streamobject2);
//根据上面的streamobject2输入流创建BufferedReader类的对象,以提高数据读取效率
System.out.println("Client " + clientnumber + " -> Server: " + bufferobject1.readLine());
//输出客户端的输入信息
readlinestring = bufferobject2.readLine();
//读取服务器端键盘输入的数据,放在字符串readlinestring中
while(!readlinestring.equals("Good bye!"))
//判断服务器端输入的字符串是不是"Good bye!",如果不是就进行循环
{
outputstream.println(readlinestring);
//将服务器端输入的字符串通过clisocket在客户端输出
outputstream.flush();
//在客户端强制输出服务器端输入的字符串
System.out.println("Server -> Client " + clientnumber + ": " + readlinestring);
//在服务器端输出自己这端键盘输入的字符串
System.out.println("Client " + clientnumber + " -> Server :" + bufferobject1.readLine());
//在服务器端输出客户端输入的信息
readlinestring = bufferobject2.readLine();
//将服务器端键盘输入的信息放在字符串变量readlinestring中
}
outputstream.close();
//关闭输出流
bufferobject1.close();
//关闭输入流
clientsocket.close();
//关闭clisocket
}
catch(Exception e)
{
System.out.println("Error:" + e);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -