日期:2014-05-17  浏览次数:21084 次

SOCKET 编程 为什么服务器只能转发一次消息就不行了。。。
这个是发送 用户名 和 要转发的消息 给服务器
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 服务器 编程

------解决方案--------------------
新建个线程来接受

Thread serverThread = new Thread(new ThreadStart(ReceiveAccept));
serverThread.Start();

        private void ReceiveAccept()
        {
            while (true)
            {
                //xxxxxxxxxxxxx
            }
        }

------解决方案--------------------
进异常捕捉了……谁叫你捕捉后啥也不干了,你什么都看不到了
------解决方案--------------------
引用:
引用:新建个线程来接受
C# code?12345678910Thread serverThread = new Thread(new ThreadStart(ReceiveAccept));serverThread.Start();         private void ReceiveAccept()        {    ……

没有新建线程的话,你的socket通信会占用程序的UI线程,所以你会看到卡。
------解决方案--------------------
引用:
引用:引用:引用:新建个线程来接受
C# code?12345678910Thread serverThread = new Thread(new ThreadStart(ReceiveAccept));serverThread.Start();     ……

没建接受消息线程之前,你接收程序的线程正保持一个连接,如果再申请发送一个连接,它会说已有一个连接,所以就没法接收消息了。我觉得是这样。
------解决方案--------------------
引用:
引用:引用:引用:新建个线程来接受
C# code?12345678910Thread serverThread = new Thread(new ThreadStart(ReceiveAccept));serverThread.Start();     ……

我的理解,
Receive 这个方法是个堵塞方法,如果接收不到会一直接收,直到传入的连接尝试排入队列。可能就堵在这里了。