📄 frame1.java~177~
字号:
DataInputStream dis; //用于实现接受从客户端发送来的数据流
PrintStream ps; //用来实现向客户端发送信息的打印流
Socket socket;
public Client(Socket s) //Client 线程的构造器
{
socket=s;
try{
dis=new DataInputStream(s.getInputStream());
//存储特定客户socket的输入流,
//接受s客户发送到服务器端的信息
ps=new PrintStream(s.getOutputStream());
//存储特定客户socket的输出流,
//发送服务器给s客户的信息
String info=dis.readLine();
//读取接受到的信息
StringTokenizer stinfo=new StringTokenizer(info,":");
//读取用":"分开的分段字符
String head=stinfo.nextToken();
//用head存储关键字的头信息
if(stinfo.hasMoreTokens())
name=stinfo.nextToken();
//关键字的第二个数据段是客户的名称
if(stinfo.hasMoreTokens())
ip=stinfo.nextToken();
//关键字的第三个数据段是客户的IP地址
jTextArea2.append("系统消息: "+name+"/"+ip+" 已经连接\n");
}
catch(IOException e){
jTextArea2.append("系统消息: 聊天服务器"+"Error "+e);
}
}
public void send(StringBuffer msg)
//实现向客户端发送信息的方法
{
ps.println(msg);
//用打印流发送信息
ps.flush();
}
public void run(){ //线程的运行方法
while(true){
String line=null;
try{
line=dis.readLine(); //读取客户端发送的数据流
}
catch(IOException e)
{
jTextArea2.append("系统消息:"+" 聊天服务器"+" Error: "+e);
disconnect(this);
notifyRoom();
return ;
}
if(line==null) //客户已经离开
{
disconnect(this);
notifyRoom();
return;
}
StringTokenizer st=new StringTokenizer(line,":");
String keyword=st.nextToken();//存储关键字,判断消息类型
String broadcast=st.nextToken();//存储消息是属于广播,还是属于单播
//如果单播,则记录的是目标用户名
if(keyword.equalsIgnoreCase("MSG")) //如果关键字是MSG,则是客户端发送的聊天信息
{
StringBuffer message=new StringBuffer("MSG:");//在服务器端建立一个缓冲区,用于信息的发送
message.append(broadcast+":");
message.append(st.nextToken("\0"));
if(broadcast.equalsIgnoreCase("BROAD"))
{
sendClients(message);
}
else
{
jTextArea2.append(broadcast);
sendtoClient(message,broadcast);
}
}
else if(keyword.equalsIgnoreCase("QUIT")) //如果关键字是QUIT,则是客户端发送的退出信息
{
list1.clear();
disconnect(this);
for(int i=0;i<clients.size();i++)
{
Client listdata1=(Client)clients.elementAt(i);
list1.add(listdata1.name+" "+listdata1.ip+" 已经连接",i);
}
notifyRoom();
this.stop();
}
}
}
}
void send_actionPerformed(ActionEvent e) {
StringBuffer info=new StringBuffer("MSG");
info.append(":"+"SERVER"+":");
info.append(jTextField2.getText());
sendClients(info);
jTextField2.setText("");
}
void sysexit_actionPerformed(ActionEvent e) {
sendClients(new StringBuffer("QUIT:"+"SERVER"));
closeAll();
System.exit(0);
}
void link_actionPerformed(ActionEvent e) {
//进行服务器的初始化建立
if (serverSocket == null) {
try {
serverSocket = new ServerSocket(4000);
//建立一个服务器,端口为4000
jTextArea2.append("系统提示: 聊天服务器 系统开始启动......\n");
}
catch (IOException ee) {
jTextArea2.append("系统消息: 聊天服务器 "+ e.toString() + "\n");
}
}
if(serverSocket!=null){
jTextArea2.append("系统消息: 聊天服务器 已经启动\n");
Thread a=new watch();
//启动监视线程
a.start();
}
}
class watch extends Thread{
int i=0;
public void run(){
while(true){
if(clients.size()<20)
//当客户数目小于20的时候开始连接
{
try{
socket=serverSocket.accept();
}
catch(IOException ee){
jTextArea2.append("系统消息: 聊天服务器 "+
ee.toString()+" 用户连接失败\n");
}
do{
Client c=new Client(socket);
//定义并实例化一个Client线程,每一个线程对应一个客户连接
clients.addElement(c);
//加入到clients数组中
if(checkName(c))
{
int num=active_connects++;
active_connects++;//连接数目加1
jTextField1.setText("目前已经有"+num+"用户连接");
//在状态栏中显示目前的活动数目
Client listdata=(Client)clients.elementAt(i);
list1.add(listdata.name+" "+listdata.ip+" 已经连接",i);
c.start();
//启动线程
notifyRoom();
//监视聊天窗口的连接变化
}
else{
c.ps.println("FaultName");
//检查名字不合法,则在发送流中发送FaultName
disconnect(c);
//断开连接
}
i++;
break;
}
while(i<clients.size());
}
else{ //如果超过连接数目
try{
Thread.sleep(400); //睡眠一段时间然后重新连接
}
catch(InterruptedException ee)
{
}
}
} //end of while*/
}//end of run
}////end of watch class
}
class Frame1_send_actionAdapter implements java.awt.event.ActionListener {
Frame1 adaptee;
Frame1_send_actionAdapter(Frame1 adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.send_actionPerformed(e);
}
}
class Frame1_sysexit_actionAdapter implements java.awt.event.ActionListener {
Frame1 adaptee;
Frame1_sysexit_actionAdapter(Frame1 adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.sysexit_actionPerformed(e);
}
}
class Frame1_link_actionAdapter implements java.awt.event.ActionListener {
Frame1 adaptee;
Frame1_link_actionAdapter(Frame1 adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.link_actionPerformed(e);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -