服务器没有接收Java应用程序写入套接字的字节

时间:2009-06-22 22:25:35

标签: java sockets

我有以下Java套接字客户端应用程序,它将相同的字符串发送到套接字服务器:

import java.net.*;
import java.io.*;

public class ServerClient {
public static void main(String[] args) throws IOException {
    System.out.println("Starting a socket server client...");
    Socket client = new Socket("XXX.X.XXX.XX", 12001);
    BufferedOutputStream stream = new BufferedOutputStream(client.getOutputStream());
    String message = "ABC";

    BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));      
    String input = null;
    while ( true ) {
        System.out.print("Would you like to send a message to Server? ");
        input = inputReader.readLine();
        if ( !input.equals("Y") ) break;    

        System.out.println("Message to send: " + message);
        System.out.println("Message length is: " + message.length());

        byte[] messageBytes = message.getBytes("US-ASCII");
        stream.write(messageBytes, 0, messageBytes.length);
        stream.flush();
    }
    System.out.println("Shutting down socket server client...");        
    stream.close();
    client.close();
    inputReader.close();
}
}

第一次发送消息时,服务器接收消息;但是,每次我尝试发送此消息时,服务器都没有收到任何信息。消息简直消失了。我成功地写了套接字(没有例外)但管道的另一边没有任何东西(或者我被告知)。

我无法访问服务器应用程序,日志或代码,因此我想知道是否有任何方法可以推荐,以找出服务器未接收后续消息的原因。任何想法将不胜感激!

澄清

  1. 服务器不期望新行;否则,它会如何第一次收到消息?作为试错,我确实尝试在字符串末尾发送'\ n'和“\ r \ n”以及0x00字符 - 所有这些都没有任何运气。

  2. 我认为刷新是一个问题,所以我尝试了各种输出流类(PrintStream,PrintWriter,FilterOutputStream),但仍然遇到了同样的问题。那么,如果“冲洗”是一个问题,它是如何第一次工作的?

3 个答案:

答案 0 :(得分:1)

记住:

  • TCP是面向流的。不是面向消息的。
  • 客户端上的一次写入可能需要在服务器上进行多次读取才能读取
  • 服务器可以在一次读取中读取客户端上的多次写入
  • 您很难在本地网络上的测试应用程序中看到上述情况,您将在生产环境中非常快速地看到它们,或者当您开始真正加快发送/接收时。

在此之后,如果您要发送消息,则需要使用分隔符或其他指示“此处为一条消息”的方式,例如将协议定义为'第一个字节是后续消息的长度'。 并且您需要检查接收端是否读取了部分消息,整个消息及其任何组合(例如,一个读取可能已读取3个半消息..)。

您的测试应用的快速解决方案,写行。也就是说,后跟换行符的字符串。然后,缓冲读取器的ReadLine()可以在接收端为您重新组装。

答案 1 :(得分:1)

其他测试:

1 - 使用网络嗅探器查看网络上正在发生的事情

2 - 使用TCP Test Tool之类的程序将数据发送到服务器并模拟您的程序。 (也可以使用netcat,但每行后都会发送换行符)

答案 2 :(得分:0)

它在这里正常工作......但是在发送信息后我错过了回车或其他消息的结尾
如果不知道服务器的意图(协议),很难写更多... 也许你应该尝试像

这样的东西
String message = "ABC\n";