一、socket简单客户端与服务端
客户端发送消息给服务端,服务端接收到消息后回应客户端。
客户端:
import java.io.*;
import java.net.Socket;
public class MainClient1 {
public static void main(String[] args) {
try {
//设置发送到的ip和端口
Socket socket = new Socket("127.0.0.1", 9999);
//从socket获取输出流到缓冲写区,用来发送数据到服务端
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//获取Socket的输入流,用来接收从服务端发送过来的数据
DataInputStream in = new DataInputStream(socket.getInputStream());
//缓冲读区的内容写入缓冲写区,发送到服务端
bufferedWriter.write("你好,我的第一个socket!");
bufferedWriter.flush();
socket.shutdownOutput();
//获取服务端返回的数据
System.out.println(in.readUTF());
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端:
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class MainServer {
public static void main(String[] args) {
try {
//服务端绑定端口
ServerSocket serverSocket = new ServerSocket(9999);
//获取客户端连接(accept是阻塞的,如果有多个客户端而服务端不用多线程会只获取第一个连接的客户端)
Socket socket = serverSocket.accept();
//获取Socket的输出流,用来向客户端发送数据
DataOutputStream out = new DataOutputStream (socket.getOutputStream());
//获取Socket的输入流,用来接收从客户端发送过来的数据
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
String str = reader.readLine();
System.out.println("客户端发来的消息:"+str);
//发送消息到对应的客户端
out.writeUTF("服务端回复:已收到你的消息\"" + str+"\"");
} catch (IOException e) {
e.printStackTrace();
}
}
}
测试:
先启动服务端,再启动客户端。
二、socket客户端多次发送消息到服务端
客户端从键盘可多次发送消息给服务端,服务端接每次收到消息后回应客户端。
客户端:
import java.io.*;
import java.net.Socket;
public class MainClient1 {
public static void main(String[] args) {
try {
//设置发送到的ip和端口
Socket socket = new Socket("127.0.0.1", 9999);
//从socket获取输出流到缓冲写区
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));
//获取Socket的输入流,用来接收从服务端发送过来的数据
DataInputStream in = new DataInputStream(socket.getInputStream());
while (true) {
//获取键盘输入的内容到缓冲读区
bufferedWriter.write(bufferedReader.readLine());
bufferedWriter.write("\n");
bufferedWriter.flush();
//获取服务端返回的数据
System.out.println(in.readUTF());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class MainServer {
public static void main(String[] args) {
try {
//服务端绑定端口
ServerSocket serverSocket = new ServerSocket(9999);
//获取客户端连接
Socket socket = serverSocket.accept();
//获取Socket的输出流,用来向客户端发送数据
DataOutputStream out = new DataOutputStream (socket.getOutputStream());
//获取Socket的输入流,用来接收从客户端发送过来的数据
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
String str ;
while ((str = reader.readLine()) != null) {
//输出打印
System.out.println("客户端发来的消息:"+str);
//发送消息到对应的客户端
out.writeUTF("服务端回复:已收到你的消息\"" + str+"\"");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
测试:
先启动服务端,再启动客户端,客户端可多次输入消息。
三、socket多客户端多次发送消息到服务端
上面的例子是一个客户端对应一个服务端,下面采用多线程对多个客户端对应一个服务端进行示例说明。
客户端1:
import java.io.*;
import java.net.Socket;
public class MainClient1 {
public static void main(String[] args) {
try {
//设置发送到的ip和端口
Socket socket = new Socket("127.0.0.1", 9999);
//从socket获取输出流到缓冲写区
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));
//获取Socket的输入流,用来接收从服务端发送过来的数据
DataInputStream in = new DataInputStream(socket.getInputStream());
while (true) {
//获取键盘输入的内容到缓冲读区
bufferedWriter.write(bufferedReader.readLine());
bufferedWriter.write("\n");
bufferedWriter.flush();
//获取服务端返回的数据
System.out.println(in.readUTF());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端2:
import java.io.*;
import java.net.Socket;
public class MainClient2 {
public static void main(String[] args) {
try {
//设置发送到的ip和端口
Socket socket = new Socket("127.0.0.1", 9999);
//从socket获取输出流到缓冲写区
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));
//获取Socket的输入流,用来接收从服务端发送过来的数据
DataInputStream in = new DataInputStream(socket.getInputStream());
while (true) {
//获取键盘输入的内容到缓冲读区
bufferedWriter.write(bufferedReader.readLine());
bufferedWriter.write("\n");
bufferedWriter.flush();
//获取服务端返回的数据
System.out.println(in.readUTF());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MainServer {
public static void main(String[] args) {
try {
//服务端绑定端口
ServerSocket serverSocket = new ServerSocket(9999);
//定长线程池
ExecutorService executorService = Executors.newFixedThreadPool(100);
while (true) {
Socket socket = serverSocket.accept();
//每当有一个服务端连接到服务器就新开一个线程处理
executorService.execute(() -> {
try {
//socket中获取输入流到缓冲区
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
//获取Socket的输出流,用来向客户端发送数据
DataOutputStream out = new DataOutputStream (socket.getOutputStream());
String str;
//读取缓冲区信息到str并输出
while (((str = reader.readLine()) != null)) {
System.out.println("客户端发来的消息:"+str);
//发送消息到对应的客户端
out.writeUTF("服务端回复:已收到你的消息\"" + str+"\"");
}
} catch (IOException e) {
e.printStackTrace();
}
});
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
测试:
先启动服务端,再启动两个客户端,两个客户端可多次输入消息接受服务端的响应。
在idea中启动多个main的方法技巧:
要启动哪个就右上角切换哪个。
参考: