繁体   English   中英

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

[英]Server not receiving bytes written to a socket by Java app

我有以下 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),但仍然遇到相同的问题。 那么,如果“冲洗”是一个问题,它第一次是如何工作的?

记住:

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

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

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

其他测试:

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

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

它在这里正常工作......但我在发送消息后缺少回车或消息的其他结尾
在不知道服务器期望什么(协议)的情况下很难写更多......也许你应该尝试类似的东西

String message = "ABC\n";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM