这个是发送 用户名 和 要转发的消息 给服务器
net.Write(Encoding.Unicode.GetBytes(textBox6.Text), 0, Encoding.Unicode.GetBytes(textBox6.Text).Length);//net.Write(Encoding.Unicode.GetBytes(textBox1.Text), 0, Encoding.Unicode.GetBytes(textBox1.Text).Length);//byte[] qq = new byte[222];
net.Read(qq, 0, qq.Length);
string conresult = Encoding.Unicode.GetString(qq);
richTextBox1.AppendText(conresult);
下面是服务器转发
Socket clientSkt = hashtable[obj] as Socket;
while (true)
{
try
{
byte[] _cmdBuff = new byte[128];
clientSkt.Receive(_cmdBuff);
string _receiver = Encoding.Unicode.GetString(_cmdBuff).TrimEnd('\0');
byte[] _packetBuff = new byte[_maxPacket];
clientSkt.Receive(_packetBuff);
if (hashtable.ContainsKey(_receiver))
{
//通过转发表查找接收方的套接字
Socket receiverSkt = hashtable[_receiver] as Socket;
receiverSkt.Send(_packetBuff);
}
else
{
string sysMessage = string.Format("[系统消息]您刚才的内容没有发送成功。\r\n可能原因:用户 {0} 已离线或者网络阻塞。\r\n\r\n", _receiver);
clientSkt.Send(Encoding.Unicode.GetBytes(sysMessage));
}
}
catch(Exception e)
{}
}socket服务器编程

解决方案 »

  1.   

    新建个线程来接受Thread serverThread = new Thread(new ThreadStart(ReceiveAccept));
    serverThread.Start();        private void ReceiveAccept()
            {
                while (true)
                {
                    //xxxxxxxxxxxxx
                }
            }
      

  2.   

    没有新建线程的话,你的socket通信会占用程序的UI线程,所以你会看到卡。
      

  3.   

    我的理解,
    Receive 这个方法是个堵塞方法,如果接收不到会一直接收,直到传入的连接尝试排入队列。可能就堵在这里了。
    多客户端可以在服务端这建个
    private Socket[] clientSocket;//为客户端建立的SOCKET连接。
    一个客户端对应一个socket