📄 clientthread.java
字号:
// 程序:处理客户端联机多线程
// 范例文件:ClientThread.java
import java.io.*;
import java.awt.*;
import java.net.*;
import java.util.*; //为了建立Vector实体
import java.awt.event.*;
class ClientThread extends Thread //用来和客户端沟通的线程
{
Socket cSocket0,cSocket1; //和客户端联机的插座
PrintStream write0,write1; //输出讯息
BufferedReader read0,read1; //输入讯息
ServerThread sThread;
ClientThread c;
BroadCastInstant BCI;
TextArea sStatus;
String m;
public static int ConnectNumber = 0; //计算联机数
public ClientThread(Socket cSocket0,Socket cSocket1,ServerThread sThread)
{
this.cSocket0 = cSocket0;
this.cSocket1 = cSocket1;
this.sThread = sThread;
sStatus = sThread.frame.ServerStatus;
ConnectNumber++; //建立新联机,联机数加1
try
{
//建立I/O管道
write0 = new PrintStream(cSocket0.getOutputStream());
read0 = new BufferedReader(new InputStreamReader(cSocket0.getInputStream()));
write1 = new PrintStream(cSocket1.getOutputStream());
read1 = new BufferedReader(new InputStreamReader(cSocket1.getInputStream()));
}
catch(IOException E) //发生异常的话
{
System.out.println("发生异常: " + E);
System.out.println("建立I/O管道失败!");
System.exit(3); //离开程序
}
m = getClientName() + "已加入聊天室==";
m = m + "聊天室人数: " + ConnectNumber + " \n\n\n";
sThread.messages.addElement(m); //广播新成员加入讯息
sThread.messages1.add(sThread.messages1.size()-1, getClientName()) ;
}
public void run()
{
while(true)
{
try
{
String Message0 = read0.readLine(); //读取客户端讯息
synchronized(sThread.messages) //同步处理
{
if(Message0 != null) //读到资料
{
if(Message0.equals("bye")) //如果是bye字符串则结束联机
{
ConnectNumber--; //联机数减1
//广播成员离开讯息
Message0 = getClientName() + ":" + getClientAddress() +
"已离开 ";
sStatus.append(Message0 + " ");
sStatus.append("目前在线人数: " + ConnectNumber + "\n");
sThread.messages.addElement(Message0);
for(int i=0;i<sThread.messages1.size();i++) //删除对应的离线人员
{
String m=(String)sThread.messages1.get(i);
if(m.equals(getClientName() ))
sThread.messages1.removeElement(getClientName());
}
synchronized(sThread.Clients) //同步处理
{
sThread.Clients.removeElement(this); //移除联机
BCI=new BroadCastInstant(sThread);
break; //结束线程
}
}//if
else
{
//广播客户端讯息
Message0 = getClientName() + ":" + getClientAddress() +"say:"+ "\n" + Message0 + "\n";
sThread.messages.addElement(Message0);
}
}//if
}
}//try
catch(IOException E) //当有联机中断时
{
break; //结束线程
}
}//while
}
public String getClientName() //取得客户端主机名称
{
return cSocket0.getInetAddress().getHostName();
}
public String getClientAddress() //取得客户端主机位置
{
return cSocket0.getInetAddress().getHostAddress();
}
public void finalize()
{
try
{
read0.close();
write0.close();
cSocket0.close(); //关闭服务器程序联机
}
catch(IOException E){}
cSocket0 = null; //释放资源
cSocket1 = null;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -