【发布时间】: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 代码是否导致服务器返回空响应?