java - 通过 TCP 的 C# 到 Java UTF8 字符串
问题描述
由于客户端出现 EOF 错误,我无法将 UTF-8 字符串从 C# 服务器发送到 Java 客户端。如何正确配置 C# 服务器?我认为错误就在那里,因为这个客户端与下面显示的 Java 服务器一起工作。
Java 客户端的接收函数执行此操作(如果我从Java服务器接收,这也有效,如下所示):
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream()); //The constructor initialises a field, using the socket object.
StringBuilder inputMessage = new StringBuilder();
inputMessage.append((String) dataInputStream.readUTF());
所需的 C# 服务器:
static async Task Main(string[] args)
{
TcpListener server = new TcpListener(IPAddress.Any, 34567);
server.Start();
byte[] bytes = new byte[4096];
byte[] responseBytes;
using (var client = await server.AcceptTcpClientAsync()){
using(var tcpStream = client.GetStream())
{
await tcpStream.ReadAsync(bytes, 0, bytes.Length);
var playerNumber = Encoding.UTF8.GetString(bytes);
Console.WriteLine("Player " + playerNumber + " connected."); //java client to server works.
StringBuilder outputMessage = new StringBuilder("Some output");
responseBytes = Encoding.UTF8.GetBytes(outputMessage.ToString());
await tcpStream.WriteAsync(responseBytes, 0, responseBytes.Length); //This doesn't work...
}
server.Stop();
}
}
错误:
java.io.EOFException
at java.base/java.io.DataInputStream.readFully(DataInputStream.java:201)
at java.base/java.io.DataInputStream.readUTF(DataInputStream.java:613)
at java.base/java.io.DataInputStream.readUTF(DataInputStream.java:568)
at Client.Connection.Receive(Connection.java:26)
at Client.Main.lambda$main$0(Main.java:30)
at com.sun.javafx.application.PlatformImpl.lambda$startup$5(PlatformImpl.java:271)
at com.sun.glass.ui.Application.invokeAndWait(Application.java:464)
at com.sun.javafx.tk.quantum.QuantumToolkit.runToolkit(QuantumToolkit.java:366)
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$startup$10(QuantumToolkit.java:280)
at com.sun.glass.ui.Application.lambda$run$1(Application.java:153)
有趣的是,执行此操作的Java 服务器可以:
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
StringBuilder outputMessage = new StringBuilder("Some output");
dataOutputStream.writeUTF(outputMessage.toString());
dataOutputStream.flush();
编辑
这是从工作 Java 服务器接收的。“bytearr”包含我用于消息的 100 个字节和 0 的 100 个字节(它们在我的消息之后)。“chararr”正确地将前 100 个字节视为有意义的内容,将后 200 个字节视为“\u0000”:
这是从非工作 C# 服务器接收的。与正确版本相比,它似乎开始两个字节,而且它的“chararr”仅包含数千个“\u0000”:
解决方案
DataInputStream 的readUTF读取一种特殊的数据格式,它不是读取 UTF-8 字节序列的通用方法。最值得注意的是,它需要一个初始字节序列来指定流的长度。
推荐阅读
- javascript - 当通过同时查看 2 个或更多键来确定唯一性时,如何从对象数组中删除重复项
- mysql - JSON_EXTRACT 和方括号
- r - 更改 R 中数据框列中的所有值
- symfony - Symfony 4 第一个事件
- valgrind - VSTS 托管 Linux - valgrind 失败 - 没有新的代码更改
- cryptography - Nim 中的 Cryptopals 1.2:XOR 返回意外值
- python - Python CSV 解析字典和查找元素的索引
- c# - 从 IIS 中的网站重新启动和监视服务
- php - 通过表单提交更改 PHP 变量/值
- c# - 如何使用 AVCaptureVideoDataOutput 在 AVCaptureSession 中避免丢帧