📄 chatserver.java
字号:
import java.net.*;
import java.io.*;
import java.util.*;
public class ChatServer{
ServerSocket server;
Socket client;
InputStream in;
OutputStream out;
String msg,name;
Vector v;
ArrayList names;
int i;
Date d;
public ChatServer(){
v = new Vector();
names = new ArrayList();
try{
server = new ServerSocket(8787);
System.out.println ("Server started");
while(true){
client = server.accept();
// System.out.println ("目前本聊天室共 "+i+" 人在线");
in = client.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
name = br.readLine();
out = client.getOutputStream();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(out),true);
if(delName(names,name,"reName")){ //判断是否重复登录
// delName(names,name,"reName"));
pw.println("1r2e3N4a5m6e7");
continue;
}
names.add(name);
i++;
pw.println(name+",欢迎您,您是本聊天室第 "+i+" 位聊客。祝您愉快!");
v.add(pw);
d = new Date();
for (int i = 0; i<v.size(); i++){
if(v.size() > 1){ //因为第一个进来的是本人,所以下面那句话不发送回去
pw = (PrintWriter)v.get(i);
pw.println(getNames(names)+"|"+v.size()); //把所有的人名和总人数发送回去
if((i+1)>=v.size()){ //因为第v.size()-2个是本人,所以上面那句话不发送回去
continue;
}
pw.println(name+"迈着轻快的步子进入了夜半聊天室!"+"\t\t\t"+d.toString());
}
}
ThreadS ts = new ThreadS(br);
ts.start();
}
}
catch(Exception e){
System.out.println ("服务器已经启动或者客户机连接不上!");
e.printStackTrace();
}
}
public String getNames(Collection c){//把名字列表列成一个字符串
String n="";
Iterator it = c.iterator();
while(it.hasNext()){
n +="|"+it.next();
}
return n;
}
public boolean delName(Collection c,String name,String temp){ //有人退出后执行 也可用来判断用户是否重复登录
Iterator it = c.iterator();
PrintWriter pw;
int k=-1;
boolean judge = false;
while(it.hasNext()){
k++;
// System.out.println (it.next());
if(name.equals(it.next())){
if(temp.equals("closed")){
judge = false;
it.remove();
// System.out.println (k);
v.remove(k);
break;
}
if(temp.equals("reName")){
judge = true;
return true;
}
}
}
for (int i = 0; i<v.size(); i++){
pw = (PrintWriter)v.get(i);
pw.println(getNames(c)+"|"+v.size()); //把所有的人名和总人数发送回去
}
return judge;
}
class ThreadS extends Thread{
private PrintWriter pw;
private BufferedReader br;
public ThreadS(BufferedReader br){ //如果不传参数br进来,服务器只能读最后连上来的客户机的数据
this.br = br;
}
public void run(){
try{
boolean b=false;
while(true){
msg = br.readLine();
d = new Date();
StringTokenizer st = new StringTokenizer(msg,";");
while(st.hasMoreTokens()){
if(st.nextToken().equals("1C2l3o4s5e")){
b = true;
msg = st.nextToken();
delName(names,msg,"closed"); //把列表中的名字删除掉
break;
}
}
for (int i = 0; i<v.size(); i++){
if(b){
msg=msg+" 依依不舍地离开了夜半聊天室!" ;
//continue;
// break;
b = false;
pw = (PrintWriter)v.get(i);
pw.println(msg+"\t\t\t"+d.toString());
}
else{
pw = (PrintWriter)v.get(i);
pw.println(msg+"\t\t\t"+d.toString());
}
}
System.out.println(msg+"\t\t\t"+d.toString());
}
}
catch(Exception e){
// pw.println("一位聊友偷偷地离开了本聊天室!");
// System.out.println ("某一客户机不正常常关闭!");
}
}
}
public static void main(String[] args){
new ChatServer();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -