java中使用Socket示例
一.main方式
1.客户端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Timer;
import java.util.TimerTask;
public class SocketClient {
public static void main(String[] args) {
while (true) {
try {
Socket socket = new Socket("localhost", 5000);
System.out.println("成功连接服务器");
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
Timer timer = new Timer();
timer.schedule(new HeartbeatTask(out), 0, 10000);
String response;
while ((response = in.readLine()) != null) {
System.out.println("服务器响应:" + response);
}
out.close();
in.close();
socket.close();
break;
} catch (IOException e) {
System.err.println("无法连接服务器,正在尝试重连...");
try {
Thread.sleep(5000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
}
}
class HeartbeatTask extends TimerTask {
private PrintWriter out;
public HeartbeatTask(PrintWriter out) {
this.out = out;
}
@Override
public void run() {
out.println("Heartbeat");
System.out.println("发送心跳消息");
}
}
2.服务端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketService {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(5000);
System.out.println("服务器启动,等待客户端连接...");
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("客户端已连接");
ClientHandler clientHandler = new ClientHandler(clientSocket);
clientHandler.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ClientHandler extends Thread {
private Socket clientSocket;
public ClientHandler(Socket socket) {
this.clientSocket = socket;
}
@Override
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("客户端消息:" + inputLine);
out.println("服务器收到消息:" + inputLine);
}
in.close();
out.close();
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
二.springBoot方式
1.客户端
import org.springframework.stereotype.Component;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Timer;
import java.util.TimerTask;
@Component
public class SocketClient {
public void startSocketClient() {
socketClient();
}
public void socketClient() {
while (true) {
try {
Socket socket = new Socket("localhost", 5000);
System.out.println("成功连接服务器");
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
Timer timer = new Timer();
timer.schedule(new HeartbeatTask(out), 0, 10000);
String response;
while ((response = in.readLine()) != null) {
System.out.println("服务器响应:" + response);
}
out.close();
in.close();
socket.close();
break;
} catch (IOException e) {
System.err.println("无法连接服务器,正在尝试重连...");
try {
Thread.sleep(5000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
}
}
class HeartbeatTask extends TimerTask {
private PrintWriter out;
public HeartbeatTask(PrintWriter out) {
this.out = out;
}
@Override
public void run() {
out.println("Heartbeat");
System.out.println("发送心跳消息");
}
}
2.服务端
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@Component
public class SocketService {
private static final int CORE_POOL_SIZE = 4;
private static final int MAX_POOL_SIZE = 8;
private static final int QUEUE_CAPACITY = 20;
private static final Long KEEP_ALIVE_TIME = 1L;
@Autowired
private SocketClient socketClient;
@PostConstruct
public void startSocket() {
ThreadPoolExecutor executor = new ThreadPoolExecutor(
CORE_POOL_SIZE,
MAX_POOL_SIZE,
KEEP_ALIVE_TIME,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(QUEUE_CAPACITY),
new ThreadPoolExecutor.CallerRunsPolicy());
Thread thread = new Thread(() -> {
this.startSocketService();
}, "startSocketServiceThread");
executor.execute(thread);
Thread thread2 = new Thread(() -> {
socketClient.startSocketClient();
}, "startSocketClientThread");
executor.execute(thread2);
}
public void startSocketService() {
socketService();
}
public void socketService() {
try {
ServerSocket serverSocket = new ServerSocket(5000);
System.out.println("服务器启动,等待客户端连接...");
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("客户端已连接");
ClientHandler clientHandler = new ClientHandler(clientSocket);
clientHandler.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ClientHandler extends Thread {
private Socket clientSocket;
public ClientHandler(Socket socket) {
this.clientSocket = socket;
}
@Override
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("客户端消息:" + inputLine);
out.println("服务器收到消息:" + inputLine);
}
in.close();
out.close();
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}