【发布时间】:2018-12-10 07:56:08
【问题描述】:
我在 Java 中使用 DataInputStream 和 DataOutputStream 时遇到问题,如果没有一些非常愚蠢的措施,我无法解决,我想知道是否有人知道更好的方法(我非常确定有一个,但我没有没找到)。
背景:我希望能够将 Json 字符串发送到服务器并让服务器将该字符串解析为对象。这需要独立于语言,因为我正在研究的项目需要我有一个异构系统。
为了最简单的例子来说明我的问题,我将排除 Gson/Json 等的创建,因为它可以用任何字符串重新创建。代码如下:
public class ServerSide {
private final int PORT = 5001;
private ServerSocket servSock;
private Socket sock;
private DataInputStream dis;
private DataOutputStream dos;
public ServerSide() throws IOException {
servSock = new ServerSocket(PORT);
}
public void startListening() {
try {
sock = servSock.accept();
dis = new DataInputStream(sock.getInputStream());
byte[] bytes = new byte[1024];
dis.read(bytes);
String receivedMessage = new String(bytes);
System.out.println("Message received: " + receivedMessage);
sock.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
一个简单的测试类,它创建一个 ServerSide() 并在一段时间内调用 startListening(true)。
public class ClientSide {
private final int PORT = 5001;
private Socket socket;
private DataOutputStream dos;
public ClientSide() {
}
public void sendMessage(String m) {
try {
socket = new Socket("127.0.0.1", PORT);
dos = new DataOutputStream(socket.getOutputStream());
dos.writeBytes(m);
System.out.println("Message sent: " + m);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
一个简单的测试类,创建ClientSide()对象并调用sendMessage("this is a test message");
我遇到的问题是我只在服务器端收到部分消息。我不确定这是否是输入或输出流的问题,并且只能通过多次写入和读取数据并修剪它们之间的空白来找到解决方法。我的第一个问题是尝试将 Json 字符串发送到我用 c# 编写的程序时,它总是会发送第一个字符(“{”),然后在下一次读取时发送字符串的其余部分。我通过发送一个空格然后在服务器端忽略它来反驳这一点。当在第一次读取时读取看似随机数量的字符串时,java-java 上的问题会变得更糟。
上述代码在服务器端的一些示例输出是:
Message received: This is a tes
Message received: T
Message received: T
Message received: T
【问题讨论】:
标签: java datainputstream