主要分几个步骤:
- 创建SocketServer,服务端。作用:接收客户端进入,转发客户端消息。
- 创建Socket,客户端。作用:连接服务端,接收和发送消息。
话不多说,上代码
public class ServerTest {
// 主入口
public static void main(String[] args) throws IOException {
socketServer();
}
//服务器设置监听8888端口,可自己修改
public static void socketServer() throws IOException {
ServerSocket server = new ServerSocket(8888);
if (server.isBound()) {
System.out.println("Socket Server was started!");
}
while (true) {
// 线程阻塞,等待客户端进入,进入户继续监听8888端口
Socket socket = server.accept();
System.out.println(socket.getInetAddress().getHostAddress() + " (" + socket.getPort() + ")连接进入");
//子线程处理进入的客户端
new SocketThread(socket).start();
}
}
}
// 暂时用内部类处理客户端信息
class SocketThread extends Thread {
private Socket socket;
private BufferedReader bufferedReader;
//存客户端,用来排除自己
private static List<Socket> socketList = new ArrayList<>();
public SocketThread(Socket socket) throws IOException {
this.socket = socket;
this.bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
socketList.add(socket);
}
@Override
public void run() {
String string;
while (true) {
try {
// 服务器在通道中读到的信息回显给客服端
string = bufferedReader.readLine();
System.out.println("客服端(" + this.socket.getPort() + ")信息:" + string);
for (Socket socket : socketList) {
//不回显给自己
if (!this.socket.equals(socket)) {
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
printWriter.write("客服端(" + this.socket.getPort() + ")信息:" + string + "\r\n");
printWriter.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public class ClientTest {
// 客服端的主入口
public static void main(String[] args) throws IOException {
socketClient();
}
//本机(127.0.0.1),局域网中是(服务器在局域网中的ip地址) 端口与服务器一致
public static void socketClient() throws IOException {
Socket socket = new Socket("127.0.0.1", 8888);
if (socket.isConnected()) {
new writer(socket).start();
new read(socket).start();
}
}
}
// 子线程,写出信息
class writer extends Thread {
private PrintWriter printWriter;
private Scanner scanner = new Scanner(System.in);
public writer(Socket socket) throws IOException {
this.printWriter = new PrintWriter(socket.getOutputStream());
}
@Override
public void run() {
scanner.useDelimiter("\r\n");
while (true) {
// 产生扫描器的线程阻塞
String str = scanner.nextLine();
System.out.println("我说:" + str);
printWriter.write(str + "\r\n");
printWriter.flush();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// 子线程,读入消息
class read extends Thread {
private BufferedReader bufferedReader;
public read(Socket socket) throws IOException {
this.bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
@Override
public void run() {
while (true) {
try {
String str = bufferedReader.readLine();
System.out.println(str);
} catch (IOException e) {
e.printStackTrace();
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
用法:
先启动服务端,再开启N个客户端,在客户端输入消息即可。