socket发送信息,服务端接收并返回信息,客户端卡死

cjf3cjf 2017-06-26 07:46:13
我要实现一个效果,客户端通过socket发消息给服务端,然后服务端收到信息后立即返回一个信息给客户端接收。但是客户端总是卡死,我尝试把客户端的接收服务端返回信息这一段代码去掉就不会卡死,但不知道为什么,请高人们帮我一下,多谢!

服务端:
    Thread thrListener = null;
private void FormMain_Load(object sender, EventArgs e)
{

try
{
thrListener = new Thread(new ThreadStart(Listen));
thrListener.Start();


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

}

}
//监听数据
private void Listen()
{
try
{
IPEndPoint ip = new IPEndPoint(IPAddress.Any, int.Parse(rport.Text));

Socket listener = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);

listener.Bind(ip);



//不断监听端口
while (true)
{

listener.Listen(10);

Socket socket = listener.Accept();
NetworkStream ntwStream = new NetworkStream(socket);
StreamReader strmReader = new StreamReader(ntwStream);

Invoke(new PrintRecvMssgDelegate(PrintRecvMssg),
new object[] { strmReader.ReadToEnd() });

//返回给客户端
byte[] sendByte = Encoding.UTF8.GetBytes("返回给客户端的信息");
socket.Send(sendByte, sendByte.Length, 0);
socket.Shutdown(SocketShutdown.Both);

socket.Close();


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


}

//线程内向文本框txtRecvMssg中添加字符串及委托
private delegate void PrintRecvMssgDelegate(string s);
private void PrintRecvMssg(string info)
{
if (info == "")
{
return;
}

this.txtSendMssg.Text += "\r\n" + string.Format("[{0}]:{1}\r\n",
DateTime.Now.ToLongTimeString(), "监听到信息") + info;

}



客户端
 private void button2_Click(object sender, EventArgs e)
{
try
{


IPAddress ip = IPAddress.Parse("127.0.0.1");
IPEndPoint ipe = new IPEndPoint(ip, int.Parse(28000));

Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(ipe);

Byte[] bytSend = Encoding.UTF8.GetBytes("发送给服务端的信息");
clientSocket.Send(bytSend);


/////接收服务端返回的信息,去掉下面这一段就不卡死,加上去就卡死
byte[] byteReceive = null;
int count, size = 512;
byte[] data = new byte[size];
MemoryStream ms = new MemoryStream();
while (0 != (count = clientSocket.Receive(data, size, SocketFlags.None)))
ms.Write(data, 0, count);
byteReceive = ms.ToArray();
ms.Close();
//////


clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();


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

}
}


注意:只是客户端加上加上接收从服务端返回信息的代码后才会卡死,不加上的话其他功能都是正常运转的。请大家帮我看看吧!
...全文
575 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
datafansbj 2019-11-05
  • 打赏
  • 举报
回复
while (0 != (count = clientSocket.Receive(data, size, SocketFlags.None))) 这一行是什么鬼?25年的老程序员表示看不懂。
大牌鸡腿 2019-11-04
  • 打赏
  • 举报
回复
接收也放到线程里就行了
  • 打赏
  • 举报
回复
接收信息专门用个线程来做就行了
chunli200902520208 2019-11-03
  • 打赏
  • 举报
回复
socket ,ReceiveTimeout超时时间设置,从什么时候开始计算的,比如设置5秒,是从连接上服务器,到客户端接收到数据的事件间隔?如果客户端while循环接收,是不是意味着 每隔5秒钟 客户端没有接收到服务端的应对都会超时?
cjf3cjf 2017-06-27
  • 打赏
  • 举报
回复
引用
你那个接收是耗时操作,你放到ui线程当然会卡,异步操作下
具体如何做,请给个提示,我是小白
倒退一天 2017-06-27
  • 打赏
  • 举报
回复
把耗时的操作放到线程去操作 Thread btnProcessThread = null; private void btnProcessFun() { IPAddress ip = IPAddress.Parse("127.0.0.1"); IPEndPoint ipe = new IPEndPoint(ip, int.Parse(28000)); Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); clientSocket.Connect(ipe); Byte[] bytSend = Encoding.UTF8.GetBytes("发送给服务端的信息"); clientSocket.Send(bytSend); /////接收服务端返回的信息,去掉下面这一段就不卡死,加上去就卡死 byte[] byteReceive = null; int count, size = 512; byte[] data = new byte[size]; MemoryStream ms = new MemoryStream(); while (0 != (count = clientSocket.Receive(data, size, SocketFlags.None))) ms.Write(data, 0, count); byteReceive = ms.ToArray(); ms.Close(); ////// clientSocket.Shutdown(SocketShutdown.Both); clientSocket.Close(); } private void button2_Click(object sender, EventArgs e) { try { btnProcessThread = new Thread(new ThreadStart(btnProcessFun)); btnProcessThread.Start(); } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); } }
csdnnetman 2017-06-26
  • 打赏
  • 举报
回复
你那个接收是耗时操作,你放到ui线程当然会卡,异步操作下

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧