JAVA实现TCPServer和TCPClient

TCPServer

原理:创建服务器套接字,绑定到指定的端口,等待客户端连接。接受客户端连接,创建线程处理连接。

代码实现:

public class TCPServer {

    private int port;
    private boolean isFinished;
    private ServerSocket serverSocket;
    private ArrayList<SocketThread> socketThreads;


    public TCPServer(int port) {
        this.port = port;
        socketThreads = new ArrayList<>();
    }


    public void start() {
        isFinished = false;
        try {
            //创建服务器套接字,绑定到指定的端口
            serverSocket = new ServerSocket(port);
            //等待客户端连接
            while (!isFinished) {
                Socket socket = serverSocket.accept();//接受连接
                //创建线程处理连接
                SocketThread socketThread = new SocketThread(socket);
                socketThreads.add(socketThread);
                socketThread.start();
            }
        } catch (IOException e) {
            isFinished = true;
        }
    }


    public void stop() {
        isFinished = true;
        for (SocketThread socketThread : socketThreads) {
            socketThread.interrupt();
            socketThread.close();
        }
        try {
            if (serverSocket != null) {
                serverSocket.close();
                serverSocket = null;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private class SocketThread extends Thread {

        private Socket socket;
        private InputStream in;
        private OutputStream out;

        SocketThread(Socket socket) {
            this.socket = socket;
            try {
                in = socket.getInputStream();
                out = socket.getOutputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void run() {
            while (!isInterrupted()) {
                if (in == null) {
                    return;
                }
                try {
                    int available = in.available();
                    if (available > 0) {
                        byte[] buffer = new byte[available];
                        int size = in.read(buffer);
                        if (size > 0) {
                            String data = new String(buffer,0,size);
                            System.out.println("TCPClient say :" + data);
                            //返回结果给TcpClient
                            String response = "TCPServer response:" + data;
                            out.write(response.getBytes());
                            out.flush();
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        void close() {

            try {
                if (in != null) {
                    in.close();
                }

                if (out != null) {
                    out.close();
                }

                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

调用例子:

        //TCPServer开启
        tcpServer = new TCPServer(port);
        new Thread(()-> tcpServer.start()).start();

        //TCPServer停止
        tcpServer.stop();

TCPClient

原理:创建一个连接的套接字,将此套接字连接到指定IP和端口的服务器,双方成功建立连接之后,就可以进行数据交互了。
代码实现:

public abstract class TCPClient {

    private String ip;
    private int port;

    private Socket mSocket;
    private SocketAddress mSocketAddress;
    private OutputStream mOutputStream;
    private InputStream mInputStream;
    private ReadThread mReadThread;
    private boolean _isConnected = false;


    public TCPClient(String ip, int port) {
        this.ip = ip;
        this.port = port;
    }


    public void connect() {

        try {
            this.mSocket = new Socket();
            this.mSocket.setKeepAlive(true);
            this.mSocketAddress = new InetSocketAddress(ip, port);
            this.mSocket.connect( mSocketAddress, 3000);// 设置连接超时时间为3秒

            this.mOutputStream = mSocket.getOutputStream();
            this.mInputStream = mSocket.getInputStream();

            this.mReadThread = new TCPClient.ReadThread();
            this.mReadThread.start();
            this._isConnected = true;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void close() {

        if (this.mReadThread != null) {
            this.mReadThread.interrupt();
        }
        if (this.mSocket != null) {
            try {
                this.mSocket.close();
                this.mSocket = null;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        this._isConnected = false;
    }

    public boolean isConnected() {
        return this._isConnected;
    }


    public void send(byte[] bOutArray) {
        try {
            this.mOutputStream.write(bOutArray);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    protected abstract void onDataReceive(byte[] bytes, int size);

    private class ReadThread extends Thread {
        @Override
        public void run() {
            super.run();
            while (!isInterrupted()) {
                try {
                    if (TCPClient.this.mInputStream == null) {
                        return;
                    }
                    int available = TCPClient.this.mInputStream.available();
                    if (available > 0) {
                        byte[] buffer = new byte[available];
                        int size = TCPClient.this.mInputStream.read(buffer);
                        if (size > 0) {
                            onDataReceive(buffer, size);
                        }
                    } else {
                        Thread.sleep(50);
                    }


                } catch (Throwable e) {
                    System.out.println(e.getMessage());
                    return;
                }
            }
        }
    }
}

调用例子:

       tcpClient = new TCPClient(ip, port) {
            @Override
            protected void onDataReceive(byte[] bytes, int size) {
                String content = "TCPServer say :" + new String(bytes, 0, size);
                System.out.println(content);
            }
        };
        tcpClient.connect();//连接TCPServer
        if (tcpClient.isConnected()) {
            //发送数据
            String outContent = "TCPClient say hello";
            tcpClient.send(outContent.getBytes());
        }


        //关闭连接
        tcpClient.close();
  • 8
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Java可以使用Socket类和ServerSocket类来实现TCP通讯。下面是一个简单的示例: 1. 服务端实现 ```java import java.io.*; import java.net.*; public class TCPServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8888); // 创建ServerSocket System.out.println("服务器已启动,等待客户端连接..."); Socket socket = serverSocket.accept(); // 监听客户端连接请求,阻塞等待 System.out.println("客户端已连接,客户端地址:" + socket.getInetAddress() + ",客户端端口号:" + socket.getPort()); BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 获取输入流 String line; while ((line = reader.readLine()) != null) { // 循环读取客户端发送的消息 System.out.println("客户端发送的消息:" + line); } reader.close(); socket.close(); serverSocket.close(); } } ``` 2. 客户端实现 ```java import java.io.*; import java.net.*; public class TCPClient { public static void main(String[] args) throws IOException { Socket socket = new Socket("localhost", 8888); // 创建Socket并连接到服务端 System.out.println("连接服务器成功,服务器地址:" + socket.getInetAddress() + ",服务器端口号:" + socket.getPort()); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); // 从控制台读取输入的消息 PrintWriter writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true); // 获取输出流 String line; while ((line = reader.readLine()) != null) { // 循环读取用户输入的消息并发送给服务端 writer.println(line); } writer.close(); reader.close(); socket.close(); } } ``` 以上就是一个简单的Java实现TCP通讯的示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值