当前位置: 首页 > 知识库问答 >
问题:

Java套接字-服务器响应始终为空

姜胤
2023-03-14

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

(客户)--

阿克

(客户)--

假设服务器应该总是快速响应。我连接到服务器,我发送数据但响应为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();

共有2个答案

鲜于德泽
2023-03-14
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字符。

柳均
2023-03-14

以下是您在java

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);
    }
}
 类似资料:
  • 线程“main”java.net.ConnectException:连接超时:在java.net.dualStackplainsockeTimpl.Connect0(本机方法)在java.net.dualStackplainsockeTimpl.socketConnect(DualStackplainsockeTimpl.java:69)在java.net.abstractplainsockeTi

  • 我正在开发web套接字应用程序。从前端来看,每个应用程序都有一个插座。但我不确定后端。我们将Python和nginx与Flask socketIO和socket io客户端库一起使用。此体系结构将用于通知前端发生了更改,并应更新数据。 以下是我的疑问-服务器上将创建多少套接字和线程?不同连接之间是否可以共享套接字?是否有任何工具可以分析插座是否打开?

  • 问题内容: 我有服务器和客户端。我的服务器接受所有连接并返回到客户端字符串。但是当我尝试发送更多行时,它崩溃了 这是我的服务器代码: 这是我的客户代码: 问题答案: 来自in中的javadoc: 关闭返回将关闭关联的套接字。 另外,关闭(和所有其他打印机/写入器)也将关闭其基础流。因此,您可以通过关闭(in ),然后尝试写入已关闭的套接字来关闭您的套接字。 要解决此问题,请不要关闭。垃圾收集将为您

  • 我编写了一个简单的java套接字服务器。我可以使用java客户端连接到它。 但是,当我尝试将android设备连接到它时,它会给出以下错误: 代码如下: 这一行:似乎是罪魁祸首。 错误消息“java.net.socketexception:套接字失败:EACCES(权限被拒绝)” Android java.net.SocketException:套接字失败:EACCES(拒绝权限) Android

  • 问题内容: 我试图用没有gui的服务器连接带有gui的客户端。连接已完成,但我看不到这两个应用程序之间的任何消息。(我应该在客户端中找到SERVER HERE,在服务器中找到CLIENT HERE) 客户端连接代码: (输入和输出在此客户端类扩展到的GUI类中定义。定义为“受保护的BufferedReader输入;受保护的PrintWriter输出;”) 另外,服务器代码: 连接似乎还可以,所以我

  • 我组装了一个Java套接字服务器和客户端,可以互相发送消息,我想使用JavaScript作为客户端,但是。。。下面是在托管Java服务器并加载JavaScript客户端时发生的情况。 JavaScript: 这将在chrome控制台中打印: 到“ws://127.0.0.1:9005/”的WebSocket连接失败:WebSocket握手期间出错:无效状态行 WebSocket错误[对象事件] 我