Java socket服务器,C#socket客户端,通信问题?

时间:2010-02-07 21:09:17

标签: c# java sockets client

嗯,我是套接字的新手,甚至是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 );

        }

......接收东西。

我为大量粘贴的代码道歉,但请耐心等待。

提前致谢!

1 个答案:

答案 0 :(得分:1)

我注意到的第一件事是你试图直接从流中读取Unicode字符串。出于两个原因,这是有问题的。

  1. UTF字符是两个字节 当你有一个奇怪的时候叫一个读 缓冲区中的字节数是 要么阻止,要么只是原因 垃圾出来了。两者都不可取。
  2. 将字符串转换为 C#中的字节并将它们发送出去,没有标题指定 数据的长度也没有 指定的终结符字符,所以没有 如果字符串是,告诉接收端(在这种情况下为Java)的方式 完整。
  3. 除了拉出原始字节的函数之外,我不建议使用readUTF或任何函数。一旦你处理了我上面提到的两个问题,你就会得到一个带有完整信息的字节数组。只有这样才能尝试将字节转换为正确的编码方案。