📄 server.java
字号:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.*;
public class Server {
static BufferedReader in;
static PrintWriter pw;
public static void main(String args[]){
try {
ServerSocket ss = new ServerSocket(3308);
Map<String, Socket> map = new HashMap<String, Socket>();
while (true) {
Socket s = ss.accept();
in = new BufferedReader(new InputStreamReader(s
.getInputStream()));
pw = new PrintWriter(s.getOutputStream());
Set<String> set = map.keySet();
StringBuilder sb = new StringBuilder("name");
for (String name : set) {
sb.append(":"+name);
}
String sss = sb.toString();
pw.println(sss);
pw.flush();
String name = in.readLine();
for(Socket socket:map.values()){//从这可以把新上线的人通知给已经在线的人
pw = new PrintWriter(socket.getOutputStream());
pw.println("1:"+name);//此为协议,1开头为上线操作
pw.flush();
}
map.put(name, s);
Thread t=new Xx(s,name,map);
t.start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Xx extends Thread{
Socket s;
String name;
Map<String,Socket> map;
PrintWriter pw;
public Xx(Socket s,String name,Map<String,Socket> map){
this.s=s;
this.name=name;
this.map=map;
}
@Override
public void run(){
try {
BufferedReader in = new BufferedReader(new InputStreamReader(s
.getInputStream()));
while(true){
String ss=in.readLine();
String sss[]=ss.split(":");
if(sss[0].equals("2")&&sss.length==2){//群发
for(Socket socket:map.values()){
pw = new PrintWriter(socket.getOutputStream());
pw.println(name+"说:"+sss[1]);
pw.flush();
}
}else if(sss[0].equals("1")&&sss.length==3){//点对点,只有相互的玩家能看到
pw = new PrintWriter(s.getOutputStream());
pw.println("我对"+sss[1]+"说:"+sss[2]);//自己屏幕上的显示
pw.flush();
pw=new PrintWriter(map.get(sss[1]).getOutputStream());
pw.println(name+"对"+"我说:"+sss[2]);//别人屏幕上的显示
pw.flush();
}
}
} catch (Exception e) {//如果发生读取异常,则代表有玩家下线,以下为玩家下线后所做的操作
map.remove(name);
for(Socket socket:map.values()){
try {
pw = new PrintWriter(socket.getOutputStream());
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
pw.println("2:"+name);//此为协议,2开头则为下线操作
pw.flush();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -