Socket网络编程循环收发消息群聊实现
package com.alatus.ourApp.test;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
public class SocketServer {
public static void main(String[] args) {
Map<String,Socket> socketMap = new HashMap<>();
try {
// 首先我们建立了服务用于接收所有访问我这个IP这个端口的请求
ServerSocket ss = new ServerSocket(8868);
System.out.println("服务已启动,等待客户端连接");
while(true){
// 任何请求进来都是一个Socket
Socket accept = ss.accept();
String ip = accept.getInetAddress().getHostAddress();
System.out.println("有客户端连接了"+ip+"端口"+accept.getPort());
socketMap.put(ip+accept.getPort(),accept);
new Thread(new Runnable() {
@Override
public void run() {
while (true){
try{
// 我们这边要做流式连接
// 我可以通过这个Socket获取输入流
InputStream inputStream = accept.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
// 输入流信息是不能直接获取的,需要通过BufferedReader装载
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String readLine = bufferedReader.readLine();
System.out.println("客户端的消息:"+readLine);
// 接下来从我们包装过的BufferedReader中读取信息
for (Map.Entry<String, Socket> entry : socketMap.entrySet()) {
Socket socket = entry.getValue();
try {
OutputStream outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(outputStream);
printWriter.println(accept.getPort()+":" + readLine);
printWriter.flush();
} catch (Exception e) {
e.printStackTrace();
break;
}
}
}
catch (Exception e) {
break;
}
}
}
}).start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.alatus.ourApp.test;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class SocketClient {
public static void main(String[] args) {
try {
// 只要我们知道对方的ip和端口号,就可以直接连接上对方
Socket socket = new Socket("127.0.0.1",8868);
// 我们需要发送消息,就需要这个虚拟连接的输出流
OutputStream out = socket.getOutputStream();
// 输出流封装,使用PrintWriter来输出,我们需要输入流,写入这个输出流内
PrintWriter printWriter = new PrintWriter(out);
System.out.println("请输入内容");
Scanner scanner = new Scanner(System.in);
new Thread(()->{
while(true){
String input = scanner.nextLine();
// 输入流就直接把客户端输入的东西写进去这个输出流,对方就会收到
printWriter.println(input);
// 关闭这个输出流
printWriter.flush();
}
}).start();
new Thread(()->{
while(true){
try{
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
System.out.println(bufferedReader.readLine());
}
catch (Exception e){
break;
}
}
}).start();
}
catch (Exception e) {
e.printStackTrace();
}
}
}