【发布时间】:2020-09-30 12:20:04
【问题描述】:
我正在尝试将数据发送到我的一台服务器并从它接收 ACK。但是,在等待来自服务器的响应时,处理会挂起。我知道有一个连接,因为我可以看到数据到达服务器。我也知道服务器正在正确输出数据,因为我的 C# 客户端正在从服务器接收数据。我会注意到这个客户端是在 centOS 虚拟机上运行的。服务器是远程 Windows 机器。我不认为虚拟环境会出现问题,因为我可以使用 SNMP java 客户端(SNMP4j 包)来调用远程服务器。我相信我的服务器也在输出原始二进制文件,但我希望无论哪种方式都能看到某种输出。
// A Java program for a Client
import java.net.*;
import java.io.*;
public class Client
{
// initialize socket and input output streams
private Socket socket = null;
private DataInputStream input = null;
private DataOutputStream out = null;
private DataInputStream serveroutput= null;
// constructor to put ip address and port
public Client(String address, int port)
{
// establish a connection
try
{
socket = new Socket(address, port);
System.out.println("Connected");
// takes input from terminal
input = new DataInputStream(System.in);
// sends output to the socket
out = new DataOutputStream(socket.getOutputStream());
serveroutput = new DataInputStream(socket.getInputStream());
}
catch(UnknownHostException u)
{
System.out.println(u);
}
catch(IOException i)
{
System.out.println(i);
}
// string to read message from input
String line = "";
// keep reading until "Over" is input
while (!line.equals("Over"))
{
try
{
line = input.readLine();
out.writeUTF(line);
System.out.println(serveroutput.readLine())
}
catch(IOException i)
{
System.out.println(i);
}
}
// close the connection
try
{
input.close();
out.close();
socket.close();
}
catch(IOException i)
{
System.out.println(i);
}
}
【问题讨论】:
-
服务器的响应是行吗?该代码将一直等待,直到它能够读取一行,因此如果服务器没有发送行,它将永远等待(或直到服务器关闭连接)。您需要确保服务器和客户端就构成完整消息的内容达成一致。在这里,您的客户端代码将一行(且仅一行)视为完整的消息。服务器有吗?
-
这可能是个好点。我如何确定它确实是一条正在发送的线路?我注意到,当我向服务器发送消息时,它会在消息前加上 \0,在后缀上加上 \n。我应该尝试添加这些字符吗?
-
同行真的懂
writeUTF()吗?如果是 C#,则不会。 -
@MarquisofLorne 好吧,我只能说 C# 服务器能够从这个 Java 客户端接收 JSON 字符串
-
@xScub 服务器是谁写的?使用的协议是否有规范,或者您是否必须对其进行逆向工程?
标签: java c# sockets tcp network-programming