聊天客户端发送一些奇怪的字符

时间:2014-11-26 18:58:43

标签: c# sockets

所以我使用C#创建基于套接字的网络聊天。这是一个学校项目。 它是基本的服务器 - 客户端聊天 - >客户端向服务器发送消息,服务器“广播”==向所有连接的客户端发送消息。

但是,如果我连接两个客户端,并将消息从一个发送到另一个,我只会得到类似的内容:

▯▯▯▯▯▯▯▯▯▯

当我再次按“发送”时(使用相同的消息),结果很好。

这是接收的功能..我在线程中使用它。

public void wait()
    {
        byte[] bytes = new byte[1024];
        while (!shutdown)
        {
           // if (shutdown) break;
            try
            {
                int bytesRec = senderSocket.Receive(bytes);

                Dispatcher.Invoke(new Action(() =>
                {

                    output.Text += "\n" + Encoding.UTF8.GetString(bytes, 0, bytesRec);
                    if (scroll.VerticalOffset == scroll.ScrollableHeight)
                    {
                        scroll.ScrollToEnd();
                    }

                }));
            }

            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }
    }

这是发送:( LCP是我自己的“protocole”..忽略这个,它只是在字符串中添加一个字母)

private void send_Click(object sender, RoutedEventArgs e)
    {
        try
        {

            LCP protocol = new LCP();
            string messg = user.Text + " pravi: " + message.Text ;
            string messag = protocol.CreateMessage(messg, "M");
            byte[] msg = Encoding.UTF8.GetBytes(messag);
            // Send the data through the socket.
            senderSocket.Send(msg);
           // int bytesRec = senderSocket.Receive(bytes);
            //output.Text += "\n" + Encoding.UTF8.GetString(bytes, 0, bytesRec);
        }

        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

这就是我在服务器上处理事情的方式:

try
    {
        listener.Bind(localEndPoint);
        listener.Listen(10);


        while (true)
        {
            Socket handler = listener.Accept();
            data = null;
            users.Add(handler.RemoteEndPoint);
            socks.Add(handler);
            new Thread(new ThreadStart(() =>
            {
                while (true)
                {
                    bytes = new byte[1024];
                    int bytesRec = handler.Receive(bytes);
                    data = Encoding.UTF8.GetString(bytes, 0, bytesRec);

                    LCP protocolParser = new LCP();
                    Dictionary<string, string> wholeMessage = protocolParser.ParseMessage(data);

                    if (wholeMessage["type"] == "$J")
                    {
                        Console.WriteLine("\nPridružil se je " + wholeMessage["message"]);
                        byte[] msg = Encoding.UTF8.GetBytes(wholeMessage["message"] + " se je pridružil");

                        foreach (Socket edp in socks)
                        {
                            edp.Send(msg);
                            //handler.SendTo(msg,edp);


                        }

                    }
                    // Show the data on the console.
                    else if (wholeMessage["type"] == "$Q")
                    {
                        handler.Shutdown(SocketShutdown.Receive);
                        handler.Close();
                        socks.Remove(handler);

                        break;
                    }
                    else
                    {
                        Console.WriteLine("\n" + wholeMessage["message"]);
                        byte[] msg = Encoding.UTF8.GetBytes(wholeMessage["message"]);

                       // Dispatcher.Invoke(new Action(() =>
                        //{
                        foreach (Socket edp in socks)
                        {
                            edp.Send(msg);
                            //handler.SendTo(msg,edp);


                        }

                       // }));


                    }
                }
                //tvoja koda
            })
            ){IsBackground=true}.Start();
            // An incoming connection needs to be processed.


            // Echo the data back to the client.

        }

    }

1 个答案:

答案 0 :(得分:2)

我已经使用TcpListener和TcpClient类解决了这个问题。