java实现socket客户端与服务端实现数据相互发送
1. socket服务端实现代码
1.1 socket服务端
package com.exchange.api.utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
@Component
@Slf4j
public class SocketServer {
@Value("${socket.port}")
private Integer port;
private ServerSocket serverSocket;
public void startServer(String data) {
try {
System.out.println("启动服务端");
serverSocket = new ServerSocket(port);
System.out.println("服务器已启动端口号为:9527,等待连接中...");
while (true) {
Socket socket = serverSocket.accept();
ServerThread ch = new ServerThread(socket, data);
Thread thread = new Thread(ch);
thread.start();
}
} catch (IOException e) {
log.error(e.getMessage());
}
}
}
1.2 服务端接收的数据在单独的线程上处理
package com.exchange.api.utils;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
@Slf4j
public class ServerThread implements Runnable {
private Socket socket;
private String data;
public ServerThread(Socket socket, String data) {
this.socket = socket;
this.data = data;
}
@Override
public void run() {
PrintWriter pw = null;
try {
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(isr);
OutputStream ops = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(ops, StandardCharsets.UTF_8);
BufferedWriter bw = new BufferedWriter(osw);
String message;
while ((message = br.readLine()) != null) {
System.out.println("收到客户端消息::" + message);
bw.write(data + "\n");
bw.flush();
}
} catch (IOException e) {
log.error(e.getMessage());
} finally {
try {
socket.close();
} catch (IOException e) {
log.error(e.getMessage());
}
}
}
}
2. socket客户端实现代码
2.1 socket客户端
package com.exchange.api.utils;
import cn.hutool.core.util.ObjectUtil;
import com.exchange.api.entity.ResponseResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
@Component
@Slf4j
public class SocketClient {
@Value("${socket.ip}")
private String ip;
@Value("${socket.port}")
private Integer port;
private Socket socket;
public void startClient() {
try {
System.out.println("连接服务端");
socket = new Socket(ip, port);
System.out.println("已连接服务端");
ClientThread sh = new ClientThread(socket);
Thread thread = new Thread(sh);
thread.setDaemon(true);
thread.start();
OutputStream ops = socket.getOutputStream();
OutputStreamWriter opsw = new OutputStreamWriter(ops, StandardCharsets.UTF_8);
BufferedWriter bw = new BufferedWriter(opsw);
while (true) {
Thread.sleep(3000);
ResponseResult result = sh.getResult();
String dataID = "";
if (ObjectUtil.isNotNull(result)) {
dataID = result.getDataID();
}
if ("aa".equals(dataID)) {
bw.write(dataID + "\n");
bw.flush();
} else {
bw.write("请传数据!" + "\n");
bw.flush();
}
}
} catch (IOException e) {
log.error(e.getMessage());
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
try {
socket.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
2.1 客户端数据处理也在单独线程执行
package com.exchange.api.utils;
import com.exchange.api.action.HandleDataAction;
import com.exchange.api.entity.ResponseResult;
import lombok.extern.slf4j.Slf4j;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
@Slf4j
public class ClientThread implements Runnable {
private Socket socket;
private ResponseResult result;
public ResponseResult getResult() {
return result;
}
public void setResult(ResponseResult result) {
this.result = result;
}
public ClientThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(isr);
String message;
while ((message = br.readLine()) != null) {
HandleDataAction action = new HandleDataAction();
action.handleData(message);
}
} catch (IOException e) {
log.error(e.getMessage());
}
}
}