tcp 客户端发送数据和服务端接收数据的简单实现

客户端代码

以下是一个传输16进制的示例

public class text {

    public static void main(String[] args) {
        String serverHost = "127.0.0.1"; // 服务器主机地址
        int serverPort = 1111; // 服务器端口号

        try {
            // 创建Socket连接服务器
            Socket socket = new Socket(serverHost, serverPort);
            System.out.println("已连接到服务器");
            // 启动定时任务,每隔一段时间发送数据
            ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
            executorService.scheduleAtFixedRate(() -> {
                try {
                    String hexString = "00010203FFFF";

                    // 将十六进制字符串转换为字节数组
                    byte[] byteArray = DatatypeConverter.parseHexBinary(hexString);


                    // 发送数据给服务端
                    OutputStream outputStream = socket.getOutputStream();
                    outputStream.write(byteArray);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }, 0, 5, TimeUnit.SECONDS); // 每隔5秒发送一次数据

            // 关闭连接
            socket.close();
            executorService.shutdown(); // 关闭定时任务
        } catch (IOException e) {
            System.err.println("无法连接到服务器:" + e.getMessage());
            e.printStackTrace();
        }

    }
}

服务器接收数据

服务器定义客户端要传输的端口号,这里是要随代码启动而启动一个服务器来接受客户端发送的数据。
这里buffer字节转为十进制用的方法是先转换为无符号整数( & 0xFF)再根据位置移位最后拼接

@Component
public class listener implements ApplicationListener<ApplicationStartedEvent> {
    private final int serverPort = 1111; // 服务器端口号
    private DataCollectionServer server;

    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        // 在Spring Boot应用启动时启动服务器
        server = new DataCollectionServer(serverPort);

        // 创建一个新的线程来启动服务器
        Thread serverThread = new Thread(server);
        serverThread.start();
    }

    static class DataCollectionServer implements Runnable {
        private final int serverPort;
        private boolean isRunning;

        public DataCollectionServer(int serverPort) {
            this.serverPort = serverPort;
            this.isRunning = false;
        }

        @Override
        public void run() {
            try {
                ServerSocket serverSocket = new ServerSocket(serverPort);
                isRunning = true;
                System.out.println("服务器已启动,等待客户端连接...");

                while (isRunning) {
                    Socket clientSocket = serverSocket.accept();
                    System.out.println("客户端已连接,地址:" + clientSocket.getInetAddress());

                    // 创建一个新的线程来处理客户端连接
                    Thread clientHandler = new Thread(new ClientHandler(clientSocket));
                    clientHandler.start();
                }

                serverSocket.close();
            } catch (IOException e) {
                System.err.println("服务器启动失败:" + e.getMessage());
                e.printStackTrace();
            }
        }

        public void stop() {
            isRunning = false;
        }

        static class ClientHandler implements Runnable {
            private final Socket clientSocket;

            public ClientHandler(Socket clientSocket) {
                this.clientSocket = clientSocket;
            }

            @Override
            public void run() {
                // 处理客户端连接的逻辑
                try {
                    // 从客户端socket获取输入流
                    DataInputStream inputStream = new DataInputStream(clientSocket.getInputStream());

                    // 读取客户端发送的数据并进行实时处理
                    byte[] buffer = new byte[1024]; // 假设数据包大小不超过1024字节
                   

                    while ((inputStream.read(buffer)) != -1) {
                       int a= buffer[0] & 0xFF;
                       int b=((buffer[1] & 0xFF) << 8) | (buffer[2] & 0xFF);
                        // 在这里可以将数据进行实时保存或处理
                    }
                } catch (IOException e) {
                	//客户端断开连接,简单输出一下日志即可
                    System.out.println(e.getMessage());
                } finally {
                    try {
                        // 关闭客户端socket
                    	if(clientSocket!=null)
                        clientSocket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值