【问题标题】:Java socket - the server response is always nullJava 套接字 - 服务器响应始终为空
【发布时间】:2016-09-29 16:48:50
【问题描述】:

我必须连接服务器(我无权访问服务器代码)但传输协议(套接字)是:

(客户端)--> 数据

ack 数据响应

(客户端)--> 确认

假定服务器应始终快速响应。我连接到服务器,我发送数据但响应为 NULL,如果我调试我的代码,当我捕获响应时会发生异常: “java.net.SocketException:软件导致连接中止:recv 失败”

我的代码:

public static void main(String[] args){
    try{
        String order = "datahere";
        String responseServer;   
        BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));  

        Socket clientSocket = new Socket();
        InetSocketAddress sa = new InetSocketAddress("XXX.XX.XX.XX", 9300);
        clientSocket.connect(sa,500);

        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());   
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));    
        outToServer.writeBytes(order);   
        responseServer = inFromServer.readLine();//exception if I try to debug my code   
        System.out.println("From server: " + responseServer); //responseServer is NULL
        clientSocket.close(); 

    } catch (IOException ex) {
            System.out.println("Error: "+ex);
    }

}

错了?有什么想法吗?

我尝试禁用防火墙并为端口 9300 添加规则,但结果相同。

客户在 Vb.Net 中给了我一个示例代码,它应该可以工作,我尝试在 Java 中复制它。

Vb.Net 中的代码:

Dim message As String = "datahere";

 Try
     Dim data As [Byte]() = System.Text.Encoding.ASCII.GetBytes(message)

     Dim client As New TcpClient(ip, port)
     Dim stream As NetworkStream = client.GetStream()
     stream.Write(data, 0, data.Length)

     data = New [Byte](2048) {}

     Dim responseData As [String] = [String].Empty
     Dim bytes As Integer = stream.Read(data, 0, data.Length)
     responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes)

     stream.Close()
     client.Close()

 Catch ex As Exception

End Try

解决方案:

Socket clientSocket = new Socket();
InetSocketAddress sa = new InetSocketAddress("XXX.XX.XX.XX", 9300);
clientSocket.connect(sa,500);

clientSocket.getOutputStream().write(order.getBytes("ASCII"));

byte[] data = new byte[2048];
int bytes = clientSocket.getInputStream().read(data, 0, data.length);
String responseData = new String(data, 0, bytes, "ASCII");
System.out.println("From server: " + responseData);

//Another way to catch the response:
//InputStreamReader in = new InputStreamReader(clientSocket.getInputStream());
//int data1 = in.read();
//while(data1 != -1) {
//   System.out.print((char) data1);
//   data1 = in.read();
//}

clientSocket.close();

【问题讨论】:

  • System.out.println("From server: " + responseServer); 总是返回 From Server: null ?
  • 是的,“responseServer”始终为 NULL。我无权访问服务器代码,但服务器应该始终响应,所以问题一定出在我的代码中......
  • 这意味着发送datahere 到服务器应该让它返回你的数据?
  • "datahere" 是一个字符串,其中包含服务器处理它的信息。服务器用其他文本回复我(“订单成功”、“订单错误”等),它应该总是返回一个响应。永不为空
  • vb 代码是否导致服务器返回空响应?

标签: java sockets tcp


【解决方案1】:

这是您的VB codejava 的翻译

public static void main(String[] args) throws IOException {
    String order = "datahere";

    // Try-with-resource statement will close your socket automatically
    try (Socket clientSocket = new Socket("XXX.XX.XX.XX", 9300)) {
        // Send to the sever the order encoded in ASCII
        clientSocket.getOutputStream().write(order.getBytes("ASCII"));
        // Sleep until we have bytes to read available
        while (clientSocket.getInputStream().available() == 0) {
            Thread.sleep(100L);
        }
        // Create the buffer of exactly the amount of bytes available without blocking
        byte[] data = new byte[clientSocket.getInputStream().available()];
        // Read the bytes from the server and put it into the buffer
        int bytes = clientSocket.getInputStream().read(data, 0, data.length);
        // Decode what has been read from the server that was encoded in ASCII
        String responseData = new String(data, 0, bytes, "ASCII");
        System.out.println("From server: " + responseData);
    }
}

【讨论】:

  • 谢谢,但它会无限期地保持一致:“int bytes = clientSocket.getInputStream().read(data, 0, data.length);”
  • 试试这个新版本
  • 从不退出循环 While。我会和我的客户谈谈,因为我开始认为问题可能不是我的。谢谢你的帮助。我会更新这篇文章
  • 您好,感谢您的帮助。我使用您的第一个解决方案找到了解决方案。一方面,如果数据错误,服务器不会响应(客户端给我的规范是错误的),另一方面我不能使用“while (clientSocket.getInputStream().available( ) == 0)" 因为它关闭了连接。我将使用解决方案编辑我的帖子。
  • @josekron 好消息
【解决方案2】:
DataInputStream dis = new DataInputStream( new InputStreamReader(clientSocket.getInputStream()));

    while(dis.available()>0){
    //reads characters encoded with modified UTF-8
    String temp = dis.readUTF();
    System.out.print(temp+" ");
        }

尝试使用dataInputStream 代替bufferedReader 并在dataInputStream 中使用readUTF() 方法来读取UTF 字符。

【讨论】:

  • 我删除了“new InputStreamReader”,因为 DataInputStream 需要 InputStream,而不是 InputStreamReader (DataInputStream dis = new DataInputStream(clientSocket.getInputStream()))。但永远不会进入 WHILE。
  • 感谢您的帮助,但在您的解决方案中,响应“DataInputStream dis”始终为 -1,因此永远不会进入“While”。我还没有解决问题。我会更新这篇文章。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多