实现客户端给服务端发送消息
服务端代码
package org.example;
import org.apache.commons.io.IOUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
public static void main(String[] args) {
ServerSocket server = null;
try {
server = new ServerSocket(1024); // 监听 1024 端口
System.out.println("服务启动, 等待客户端连接");
Socket socket = server.accept(); // 会阻塞等待, 直到有客户端连接
String ip = socket.getInetAddress().getHostAddress();
System.out.println("有客户端连接IP: " + ip + ", 端口: " + socket.getPort());
// 开启一个线程, 读取客户端发送的消息
new Thread(() -> {
while (true) {
try {
// 读取客户端发送的消息
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String readData = bufferedReader.readLine(); // 会阻塞等待
System.out.println("收到客户端消息: " + readData);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户端代码
package org.example;
import org.apache.commons.io.IOUtils;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class SocketClient {
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket("127.0.0.1", 1024); // 创建客户端
OutputStream outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(outputStream);
// 启动一个线程, 用于向服务器发送消息
new Thread(() -> {
while (true) {
try {
System.out.print("请输入内容: ");
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
printWriter.println(input);
printWriter.flush();
} catch (Exception e) {
e.printStackTrace();
break;
}
}
}).start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
实现服务端给客户端返回消息
服务端代码
package org.example;
import org.apache.commons.io.IOUtils;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
public static void main(String[] args) {
ServerSocket server = null;
try {
server = new ServerSocket(1024); // 监听 1024 端口
System.out.println("服务启动, 等待客户端连接");
Socket socket = server.accept(); // 会阻塞等待, 直到有客户端连接
String ip = socket.getInetAddress().getHostAddress();
System.out.println("有客户端连接IP: " + ip + ", 端口: " + socket.getPort());
// 开启一个线程, 读取客户端发送的消息
new Thread(() -> {
while (true) {
try {
// 读取客户端发送的消息
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String readData = bufferedReader.readLine(); // 会阻塞等待
System.out.println("收到客户端消息: " + readData);
// 向客户端返回消息
OutputStream outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(outputStream);
printWriter.println("服务端已收到消息: " + readData);
printWriter.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户端代码
package org.example;
import org.apache.commons.io.IOUtils;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class SocketClient {
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket("127.0.0.1", 1024); // 创建客户端
OutputStream outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(outputStream);
// 启动一个线程, 用于向服务器发送消息
new Thread(() -> {
while (true) {
try {
System.out.print("请输入内容: ");
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
printWriter.println(input);
printWriter.flush();
} catch (Exception e) {
e.printStackTrace();
break;
}
}
}).start();
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
// 启动一个线程, 用于接收服务器消息
new Thread(() -> {
while (true) {
try {
String readData = bufferedReader.readLine();
System.out.println("收到服务端消息: " + readData);
} catch (Exception e) {
e.printStackTrace();
break;
}
}
}).start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
服务端作为中转实现多个客户端之间通信
服务端代码
package org.example;
import org.apache.commons.io.IOUtils;
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) {
ServerSocket server = null;
Map<String, Socket> CLENT_MAP = new HashMap<>();
try {
server = new ServerSocket(1024); // 监听 1024 端口
System.out.println("服务启动, 等待客户端连接");
while (true) {
Socket socket = server.accept(); // 会阻塞等待, 等待客户端连接
String ip = socket.getInetAddress().getHostAddress();
System.out.println("有客户端连接IP: " + ip + ", 端口: " + socket.getPort());
String clientKey = ip + ":" + socket.getPort();
CLENT_MAP.put(clientKey, socket);
// 开启一个线程, 读取客户端发送的消息
new Thread(() -> {
while (true) {
try {
// 读取客户端发送的消息
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String readData = bufferedReader.readLine(); // 会阻塞等待
// 服务端把读取到的消息转发给指定端口的客户端, 这是群聊功能, 会把读取到的消息转发给所有注册到这个服务端上的客户端
CLENT_MAP.forEach((k, v) -> {
try {
String[] parts = k.split(":");
String port = parts[1]; // 端口号是数组的第二个元素
if (!port.equals(String.valueOf(socket.getPort()))) {
OutputStream outputStream = v.getOutputStream();
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(outputStream, "UTF8"));
printWriter.println(readData);
printWriter.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
});
} catch (IOException e) {
e.printStackTrace();
break; // 断开连接就结束这个线程即可
}
}
}).start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户端代码
多启动几个客户端就可以了,直接在一个类上启动多个客户端
package org.example;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class SocketClient {
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket("127.0.0.1", 1024); // 创建客户端
OutputStream outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(outputStream);
// 启动一个线程, 用于向服务器发送消息
new Thread(() -> {
while (true) {
try {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
printWriter.println(input);
printWriter.flush();
} catch (Exception e) {
e.printStackTrace();
break;
}
}
}).start();
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
// 启动一个线程, 用于接收服务器消息
new Thread(() -> {
while (true) {
try {
String readData = bufferedReader.readLine();
System.out.println(readData);
} catch (Exception e) {
e.printStackTrace();
break; // 断开连接就结束这个线程即可
}
}
}).start();
} catch (Exception e) {
e.printStackTrace();
}
}
}