java - 套接字 - 无连续响应

标签 java sockets

我第一次深入研究套接字。 该项目的重点是客户端能够通过编写“getall”来访问服务器中的联系人列表(CSV),并仅通过该命令(“退出”)退出程序。

问题在于客户端只能编写一次命令并接收一次列表,然后服务器不再响应客户端的输入。

这里分别是服务器和客户端的套接字代码:

服务器:

public class CatalogueServer extends CatalogueLoader {

ServerSocket serverSocket;
ArrayList<CatalogueEntry> catalogue;

public void startServer(int port, String catalogueFile) {

    catalogue = loadLocalCatalogue(catalogueFile);

    try {
        serverSocket = new ServerSocket(port);

        while (true) {
            Socket clientSocket = serverSocket.accept();

            new Thread(
                    new Runnable() {
                        public void run() {
                            try {

                                InputStream inputStream = clientSocket.getInputStream();
                                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");

                                BufferedReader BR = new BufferedReader(inputStreamReader);

                                OutputStream outputStream = clientSocket.getOutputStream();
                                PrintWriter PW = new PrintWriter(outputStream);
                                String clientInput;

                                while ((clientInput = BR.readLine()) != null) {
                                    System.out.println(clientInput);
                                    if (clientInput.equals("getall")) {
                                        System.out.println(printCatalogue(catalogue));
                                        PW.println(printCatalogue(catalogue));
                                        PW.flush();
                                        break;
                                    } else if (clientInput.equals("exit")) {
                                        clientSocket.close();
                                        BR.close();
                                        PW.close();
                                        break;
                                    } else {
                                        PW.flush();
                                        break;
                                    }
                                }
                                PW.close();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }
            ).start();
        }
    } catch (Exception i) {
        i.printStackTrace();
    }
  }
}

客户:

public class TestClient {

public static void main(String[] args) {

    try {
        Socket socket = new Socket("localhost", 5253);
        OutputStream outputStream = socket.getOutputStream();
        InputStream inputStream = socket.getInputStream();
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);

        BufferedReader BR = new BufferedReader(inputStreamReader);

        while (true) {

            String clientInput;
            String serverFeedback;

            PrintWriter PW = new PrintWriter(outputStream);

            Scanner inputScan = new Scanner(System.in, "UTF-8");
            clientInput = inputScan.nextLine();

            PW.println(clientInput);
            PW.flush();

            while ((serverFeedback = BR.readLine()) != null)  {
                System.out.println(serverFeedback);
            }

            if (clientInput.equals("exit")) {
                PW.close();
                socket.close();
                break;
            }
            PW.close();
        }
    }
    catch (IOException e){
        e.printStackTrace();
    }
  }
}

我尝试过互换读者和作者的立场和更新。但我不确定问题到底从哪里开始。

最佳答案

当你这样做时

        while ((serverFeedback = BR.readLine()) != null)  {
            System.out.println(serverFeedback);
        }

您正在阅读,直到到达流的末尾,即直到没有任何内容为止。因此,此后就没有任何内容了。

如果你想重用连接,你必须编写不使用此模式的代码,并且只读取直到它应该停止读取为止。

关于java - 套接字 - 无连续响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41040210/

相关文章:

c++ - 通过网络发送数据的常用方法是什么?

sockets - 服务器可以在单个线程中处理多个套接字吗?

java - 构造函数和用户输入遇到问题

java - 编译时出错

java - Android、Google map API、JSON 问题。获取空指针异常

java - 在没有 OAuth 的情况下使用 JWT 安全吗?

sockets - Windows Phone 7-如何以编程方式搜索和连接到蓝牙设备

language-agnostic - 更多 TCP 和 POSIX 套接字 listen() 和 accept() 语义

linux - 套接字和文件描述符重用(或缺乏)

java - 用于显示 ProgressBar 的弹出窗口未在 JavaFX 中显示