【问题标题】:Simple Java Server/Client not working?简单的 Java 服务器/客户端不起作用?
【发布时间】:2012-07-21 13:33:05
【问题描述】:

我有一个基本的服务器和一个用 Java 编码的客户端。这是我在互联网上看到的代码,并根据我的需要进行了一些修改。现在的问题是,我基本上是从客户端向服务器发送消息。该消息将是“你好”。服务器检查端口 6789 是否有包含单词“hello”的消息,如果是这样,它必须获取某个目录中所有文件/子目录的名称。这些名称中的第一个被发送回客户端并且客户端打印它。我已经打开了端口 6789 并将消息从客户端发送到服务器工作正常。服务器接收它并执行必要的操作,但它不会将数据发送回客户端。我不知道是客户端没有收到它还是服务器没有发送它。这是两个代码:

客户

    String sentence = "hello";
    Socket clientSocket = new Socket("localhost", 6789);
    DataOutputStream outToServer = new DataOutputStream(
            clientSocket.getOutputStream());
    outToServer.writeBytes(sentence + '\n');
    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(
            clientSocket.getInputStream()));
    System.out.println(inFromServer.readLine());
    clientSocket.close();

服务器

    String sentence;
    ServerSocket welcomeSocket = new ServerSocket(6789);

    while (true) {
        Socket connSocket = welcomeSocket.accept();
        BufferedReader inFromClient = new BufferedReader(
                new InputStreamReader(connSocket.getInputStream()));
        sentence = inFromClient.readLine();
        if (sentence.contains("hello")) {
            File dir = new File("D:/ServerMap/");
            String[] children = dir.list();
            if (children == null) {
                JOptionPane.showMessageDialog(frame,
                        "Either no directory or it doesn't exist");
            } else {
                DataOutputStream outToClient = new DataOutputStream(
                        connSocket.getOutputStream());
                outToClient.writeBytes(children[0]);
                JOptionPane.showMessageDialog(frame, children[0]);
            }
        }
    }

我通过一个单独导出的Runnable Jar文件来执行服务端,客户端在Eclipse中编译运行。

只是为了澄清我的问题:客户端向服务器发送“hello”-> 服务器收到消息并包含“hello”,因此 if 语句返回 true -> 服务器检查指定目录中的文件名并找到一对 - > 服务器发回它找到的第一个文件名 -> 客户端应该接收该文件名并在 Eclipse 控制台中打印它(这是不起作用的部分)

有什么建议吗?

PS:这一切都是在本地主机上完成的。它是在 1 台计算机上完成的,Windows 7 x64,端口 6789 是打开的(在我手动打开它之前根本不起作用),差不多就是这样。

【问题讨论】:

    标签: java stream client inputstream outputstream


    【解决方案1】:

    您应该从服务器中的客户端输出流中刷新数据:

    outToClient.writeBytes(children[0] + "\n");
    outToClient.flush();
    // etc.
    

    【讨论】:

    • 另外,由于客户端调用readLine,服务器需要在写调用中添加一个换行符。
    【解决方案2】:

    问题是您的客户端正在等待服务器未发送的换行符“\n”。在客户端你有 inFromServer.readLine() 而在服务器端你有 outToClient.writeBytes(children[0]) 所以你必须按照建议将它更改为 outToClient.writeBytes(children[0] + "\n")雷默斯。 BufferedReader 类中的 readLine 方法会阻塞,直到它读取到 "\n"。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多