c# - Java套接字服务器,C#套接字客户端,通信问题?

标签 c# java sockets client

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 字符串。由于两个原因,这是有问题的。

  1. UTF 字符是两个字节,所以 当你有奇怪的情况时调用读取 缓冲区中的字节数是 要么会阻止,要么只是导致 垃圾出来。两者都不是更好的选择。
  2. 当您将字符串转换为 C# 中的字节并将它们发送出去,没有 header 指定 数据的长度也没有 指定了终止符,因此没有 判断接收端(本例中为 Java)字符串是否为的方法 完成。

我不建议使用 readUTF 或除提取原始字节之外的任何函数。处理完我上面提到的两个问题后,您将拥有一个包含完整消息的字节数组。只有这样,您才应该尝试将字节转换为其正确的编码方案。

关于c# - Java套接字服务器,C#套接字客户端,通信问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2218349/

相关文章:

c# - 在 .csproj 中更改build设置的程序集名称

c# - ASP.NET 的图表控件

Java FileDialog 以编程方式设置大小

java - 控制台输出中的 IntelliJ IDEA 编码不正确

java - com.google.common.util.concurrent.Service 暂停回调?

C# SQLite 连接器问题

c# - 下一帧 WPF mediaElement

java - 如何在特定端口上搜索响应式套接字服务器(如何连接到给定端口但没有其 IP 的服务器)?

php - WebSocket 服务器端脚本调用

java - Java套接字: How to send multiple files from client based on an event to server