Erm,我对套接字很陌生,甚至对 Java 也很陌生,所以 Java 方面基本上是复制和粘贴的。 C#方面更自制一些。
我开始认为 Java 和 C# 解释字符串的方式可能有些不同;我已经使用 Java 中现在已弃用的“readLine”方法使其部分工作。
在 C# 方面:
private void pollChat()
{
while (clientSocket.Connected)
{
try
{
NetworkStream serverStream = clientSocket.GetStream();
byte[] inStream = new byte[10025];
serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize);
string returndata = System.Text.Encoding.UTF8.GetString(inStream);
msg(returndata);
}
catch (SocketException)
{
clientSocket.Close();
msg("Socket Exception");
}
}
}
...用于接收内容,(我将 System.Text.Encoding.ASCII 更改为 UTF8,但没有帮助)...并且
NetworkStream serverStream = clientSocket.GetStream();
byte[] outStream = System.Text.Encoding.UTF8.GetBytes(nickname + ": " + textBoxToSubmit.Text + "$");
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
...用于发送东西。
在 Java 服务器端...
void sendToAll( String message ) {
synchronized( outputStreams ) {
for (Enumeration e = getOutputStreams(); e.hasMoreElements(); ) {
DataOutputStream dout = (DataOutputStream)e.nextElement();
try {
dout.writeBytes( message );
} catch( IOException ie ) { System.out.println( ie ); }
}
}
}
...用于发送东西,以及
while (true) {
// ... read the next message ...
String message = din.readUTF();
// ... tell the world ...
System.out.println( "Sending "+message );
// ... and have the server send it to all clients
server.sendToAll( message );
}
...用于接收东西。
对于粘贴的大量代码,我深表歉意,但请耐心等待。
提前致谢!
最佳答案
我注意到的第一件事是您尝试直接从流中读取 Unicode 字符串。由于两个原因,这是有问题的。
- UTF 字符是两个字节,所以 当你有奇怪的情况时调用读取 缓冲区中的字节数是 要么会阻止,要么只是导致 垃圾出来。两者都不是更好的选择。
- 当您将字符串转换为 C# 中的字节并将它们发送出去,没有 header 指定 数据的长度也没有 指定了终止符,因此没有 判断接收端(本例中为 Java)字符串是否为的方法 完成。
我不建议使用 readUTF 或除提取原始字节之外的任何函数。处理完我上面提到的两个问题后,您将拥有一个包含完整消息的字节数组。只有这样,您才应该尝试将字节转换为其正确的编码方案。
关于c# - Java套接字服务器,C#套接字客户端,通信问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2218349/