📄 server.java
字号:
import java.net.*;
import java.io.*;
class Server extends Thread //接收客户机的线程
{ServerSocket serverSocket1;
QQer[]qqer=new QQer[50];
int index=-1; //QQer下标
Server()throws Exception
{try
{serverSocket1=new ServerSocket(8888); //开启8888端口
}
catch(IOException e)
{System.out.println("服务器建立失败!"+e);
throw new Exception();
}
System.out.println("服务器已正常建立!");
this.start();
}
public void run()
{while(true)
{boolean flg=true;
while(index==49) //控制上限大于50时不接收
{if(flg)
{System.out.println("聊天室已人满!");
try
{Thread.currentThread().sleep(5000);
}
catch(Exception e)
{System.out.println(e);
}
flg=false;
}
}
System.out.println("正在等待客户机连接...");
Socket client1=null;
try
{client1=serverSocket1.accept();
InputStream inStream=client1.getInputStream();
ObjectInputStream inObject=new ObjectInputStream(inStream);
qqer[++index]=(QQer)inObject.readObject();
qqer[index].client=client1;
ServerReadAndWrite thread1=new ServerReadAndWrite(client1); //与客户机对话的线程
}
catch(Exception e)
{System.out.println(e);
}
System.out.println(qqer[index].user+"进入聊天室!");
writeToAll(qqer[index].user+"进入聊天室!");
}
}
private void listDateToAll()
{String[]listDate=new String[index+2]; //因为index是下标,加1是数组长度,再加1是字符串数组中多了一个"大家"
listDate[0]="大家";
for(int i=1;i<index+2;i++)
{listDate[i]=qqer[i-1].user;
}
writeToAll("setListDate");
writeToAll(Integer.toString(listDate.length));
for(int n=0;n<listDate.length;n++)
{writeToAll(listDate[n]);
}
}
private void deleteQQer(Socket client)
{int n=49;
String user;
for(int i=0;i<=index;i++)
{if(qqer[i].client==client)
{n=i;
break;
}
}
user=qqer[n].user;
System.out.println(user+"离开聊天室");
for(int i=n;i<index;i++)
{qqer[i]=qqer[i+1];
}
index--;
listDateToAll();
writeToAll(user+"离开聊天室");
}
private void writeToAll(String str1) //发给所有用户
{Socket client1;
OutputStream outStream1;
PrintStream pStream1;
for(int i=0;i<=index;i++)
{try
{client1=qqer[i].client;
outStream1=client1.getOutputStream();
pStream1=new PrintStream(outStream1);
pStream1.println(str1);
}
catch(Exception e)
{System.out.println("writeToAll错误 "+e);
}
}
}
class ServerReadAndWrite extends Thread //与客户机对话的线程(内部类)
{Socket client1;
BufferedReader inStream;
ServerReadAndWrite(Socket client)
{try
{client1=client;
InputStream inStr=client1.getInputStream();
InputStreamReader inReader=new InputStreamReader(inStr);
inStream=new BufferedReader(inReader);
listDateToAll();
}
catch(Exception e)
{System.out.println(e);
}
this.start();
}
public void run()
{while(true)
{try
{String str1=inStream.readLine(); //读取,再发给所有客户机,包括服务器
writeToAll(str1);
}
catch(IOException e)
{deleteQQer(client1); //应该减去这个拥护
return;
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -