美文网首页
Socket 客户端和服务端实现代码

Socket 客户端和服务端实现代码

作者: wenSome | 来源:发表于2024-08-07 16:23 被阅读0次

    当然!如果需要持续接受服务端的消息,确实可以使用死循环来不断读取数据,但需要注意线程管理和性能问题。在 Android 开发中,常见的做法是使用后台线程或服务来处理网络通信。

    下面,我将分别给出 Java 和 Kotlin 的 Socket 客户端和服务端实现代码,并说明如何持续接受服务端消息的实现方法。

    1.1 服务端实现

    服务端代码示例:

    // ServerThread.java
    package com.example.myapp;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class ServerThread extends Thread {
    
        private static final int PORT = 12345;
    
        @Override
        public void run() {
            try {
                ServerSocket serverSocket = new ServerSocket(PORT);
                System.out.println("Server started, waiting for client connection...");
    
                while (true) {
                    Socket clientSocket = serverSocket.accept();
                    System.out.println("Client connected");
    
                    new ClientHandler(clientSocket).start();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        private static class ClientHandler extends Thread {
            private Socket socket;
    
            public ClientHandler(Socket socket) {
                this.socket = socket;
            }
    
            @Override
            public void run() {
                try {
                    BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    OutputStream output = socket.getOutputStream();
    
                    String clientMessage;
                    while ((clientMessage = input.readLine()) != null) {
                        System.out.println("Received from client: " + clientMessage);
                        output.write(("Message received: " + clientMessage).getBytes());
                        output.flush();
                    }
    
                    input.close();
                    output.close();
                    socket.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    解析:

    1.ServerSocket 用于监听指定端口。
    2.在 while (true) 循环中,接受客户端连接,并为每个连接创建一个新的线程(ClientHandler)以处理客户端消息。
    3.在 ClientHandler 中,使用 while 循环持续读取客户端发来的数据,并回应客户端。

    1.2 客户端实现

    客户端代码示例:

    // ClientActivity.java
    package com.example.myapp;
    
    import android.os.Bundle;
    import android.os.StrictMode;
    import androidx.appcompat.app.AppCompatActivity;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class ClientActivity extends AppCompatActivity {
    
        private static final String SERVER_IP = "127.0.0.1";
        private static final int SERVER_PORT = 12345;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_client);
    
            new Thread(() -> {
                try {
                    Socket socket = new Socket(SERVER_IP, SERVER_PORT);
                    OutputStream output = socket.getOutputStream();
                    BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    
                    // 发送数据到服务端
                    output.write("Hello, server!".getBytes());
                    output.flush();
    
                    // 持续接收服务端消息
                    String serverResponse;
                    while ((serverResponse = input.readLine()) != null) {
                        System.out.println("Response from server: " + serverResponse);
                    }
    
                    output.close();
                    input.close();
                    socket.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
    

    解析:

    1.在客户端线程中,创建 Socket 连接到服务端,并使用 OutputStream 发送数据。
    2.使用 BufferedReader 读取服务端的消息,并使用 while 循环持续接收消息。

    相关文章

      网友评论

          本文标题:Socket 客户端和服务端实现代码

          本文链接:https://www.haomeiwen.com/subject/ymxckjtx.html