TCP 套接字客户端/服务器 - 服务器仅响应来自客户端的第一个连接

我有一些简单的客户端和服务器代码,客户端向服务器发送一些字节,服务器用一些字节响应。客户端打印接收到的字节,然后关闭套接字。


这在客户端第一次运行时工作正常,但随后的调用没有响应。


package sockets.com;


// Client Side

import java.io.*;

import java.net.*;


public class ClientSideTCPSocket {

    public void run() {

        try {

            int serverPort = 4023;

            InetAddress host = InetAddress.getByName("localhost");


            System.out.println("Connecting to server on port " + serverPort);


            Socket socket = new Socket(host, serverPort);


            System.out.println("Just connected to " + socket.getRemoteSocketAddress());



            OutputStream out = socket.getOutputStream();

            InputStream in = socket.getInputStream();


            String s = "HELLO SERVER";

            byte[] bytes = s.getBytes("US-ASCII");


            for (byte b : bytes) {


                out.write(b);


            }


            int ch = 0;

            while ((ch = in.read()) >= 0) {


                System.out.println("Got byte " + ch);

            }


            out.flush();

            out.close();


            socket.close();


        } catch (UnknownHostException ex) {

            ex.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }


    public static void main(String[] args) {

        ClientSideTCPSocket client = new ClientSideTCPSocket();

        client.run();

    }

}


白板的微信
浏览 115回答 1
1回答

慕慕森

一些东西:这段代码将永远循环,直到客户端关闭连接:            while ((ch = server.getInputStream().read()) >= 0) {                System.out.println("Got byte " + ch);            }然后在客户端关闭他的连接后,后续尝试向套接字发送“HELLO CLIENT”将产生一个 IO 异常。这将触发您的服务器循环退出。简单的解决方法是调整您的协议,以便在某些标记字符上完成“消息”。在我的简单修复中,我只是将其调整为!在收到a 时爆发。最好让每个客户端会话在 ioexception 而不是整个服务器块上终止。我对你的代码的重构:public class ServerSideTCPSocket {    public void tryCloseSocketConnection(Socket socket) {        try {            socket.close();        }        catch(java.io.IOException ex) {        }    }    public void processClientConnection (Socket clientConnection) throws java.io.IOException {        int ch = 0;        while ((ch = clientConnection.getInputStream().read()) >= 0) {            System.out.println("Got byte " + ch);            if (ch == '!') {                break;            }        }        // Write to output stream        OutputStream out = clientConnection.getOutputStream();        String s = "HELLO CLIENT!";        byte[] bytes = s.getBytes("US-ASCII");        for (byte b : bytes) {            System.out.println(b);            out.write(b);        }    }    public void run() {        try {            int serverPort = 4023;            ServerSocket serverSocket = new ServerSocket(serverPort);            serverSocket.setSoTimeout(900000);            while (true) {                System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "...");                Socket clientConnection = serverSocket.accept();                try {                    System.out.println("Just connected to " + clientConnection.getRemoteSocketAddress());                    processClientConnection(clientConnection);                }                catch (java.io.IOException ex) {                    System.out.println("Socket connection error - terminating connection");                }                finally {                    tryCloseSocketConnection(clientConnection);                }            }        }        catch (IOException e) {            e.printStackTrace();        }    }    public static void main(String[] args) {        ServerSideTCPSocket srv = new ServerSideTCPSocket();        srv.run();    }}然后将您的客户端代码的消息调整为:        String s = "HELLO SERVER!";  // the exclamation point indicates "end of message".
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java