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
}
}
------解决方案--------------------进异常捕捉了……谁叫你捕捉后啥也不干了,你什么都看不到了
------解决方案--------------------
没有新建线程的话,你的socket通信会占用程序的UI线程,所以你会看到卡。
------解决方案--------------------
没建接受消息线程之前,你接收程序的线程正保持一个连接,如果再申请发送一个连接,它会说已有一个连接,所以就没法接收消息了。我觉得是这样。
------解决方案--------------------
我的理解,
Receive 这个方法是个堵塞方法,如果接收不到会一直接收,直到传入的连接尝试排入队列。可能就堵在这里了。