服务端多人聊天和一对一聊天
服务端将每个连接服务器的ip存入HashMap中,在聊天时匹配传入的ip。
public class Server {
private final static int PORT = 12345;
public static HashMap<String,Socket> hm = new HashMap<>();//ip和socket套接字
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(PORT);
System.out.println("服务器开启");
while(true) {
Socket socket = serverSocket.accept();
StringBuilder sb = new StringBuilder(socket.getInetAddress().toString());
sb.deleteCharAt(0);
System.out.println(sb.toString() + " 已连接服务器!!!");
hm.put(sb.toString(), socket);
new Thread(new chatServer(hm, sb.toString())).start();
}
}
}
public class chatServer implements Runnable {
private Socket socket;
private HashMap<String, Socket> hm;
private String mySocket;
private DataInputStream dis;
private DataOutputStream dos;
private BufferedReader br;
private PrintStream ps;
public chatServer(HashMap<String, Socket> hm, String mySocket, Socket socket) {
this.socket = socket;
this.hm = hm;
this.mySocket = mySocket;
}
@Override
public void run() {
StringBuilder sb = new StringBuilder();
try {
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String content = "";
String ip = "";
String time = "";
content = br.readLine();
ip = br.readLine();
time = br.readLine();
//ip如果是255.255.255.255就群发
if (ip!=null) {
if (ip.equals("255.255.255.255")) {
for (String IP : hm.keySet()) {
if (IP.equals(mySocket)) {
} else {
Socket s = hm.get(IP);//获取连接服务器的每个ip;
try {
ps = new PrintStream(s.getOutputStream());
if (!"".equals(content)) {
ps.println(content);
ps.println(ip);
ps.println(time);
ps.flush();
}
} catch (IOException e) {
e.printStackTrace();
hm.remove(s);
}
}
}
} else {
for (String Ip : hm.keySet()) {
if(Ip.equals(ip)) {
Socket s = hm.get(Ip);
try {
ps = new PrintStream(s.getOutputStream());
if (!"".equals(content)) {
ps.println(content);
ps.println(ip);
ps.println(time);
ps.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
} else {
sb.append(socket.getInetAddress().toString());
sb.deleteCharAt(0);
System.out.println(sb.toString() + " 已断开连接!!!");
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}