我要實作一個效果,客戶端通過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);
}
}
注意:只是客戶端加上加上接收從服務端回傳資訊的代碼后才會卡死,不加上的話其他功能都是正常運轉的。請大家幫我看看吧!
uj5u.com熱心網友回復:
你那個接收是耗時操作,你放到ui執行緒當然會卡,異步操作下uj5u.com熱心網友回復:
具體如何做,請給個提示,我是小白
uj5u.com熱心網友回復:
把耗時的操作放到執行緒去操作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);
}
}
uj5u.com熱心網友回復:
socket ,ReceiveTimeout超時時間設定,從什么時候開始計算的,比如設定5秒,是從連接上服務器,到客戶端接收到資料的事件間隔?如果客戶端while回圈接收,是不是意味著 每隔5秒鐘 客戶端沒有接收到服務端的應對都會超時?uj5u.com熱心網友回復:
接收資訊專門用個執行緒來做就行了uj5u.com熱心網友回復:
接收也放到執行緒里就行了uj5u.com熱心網友回復:
while (0 != (count = clientSocket.Receive(data, size, SocketFlags.None)))這一行是什么鬼?25年的老程式員表示看不懂。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/102065.html
標籤:C#
上一篇:wcf通訊報錯
下一篇:執行緒阻塞問題
