gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:51:09 25 4
gpt4 key购买 nike

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

(client) --> data

ack <-- (server)
data response <-- (server)

(client) --> ack

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

我的代码:

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();

最佳答案

这是用 java 翻译您的 VB 代码

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);
}
}

关于Java 套接字 - 服务器响应始终为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37549671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com