客戶端每發送一條訊息,就會主動關閉socket連接(為省電)。然后重新連接到服務器端,又發送一條訊息。因為客戶端是斷線重連,每次連接時客戶端的IP地址和埠號都不一樣。
C#代碼如下,運行時出現掉包(漏收客戶端發來的訊息),并且一會兒就出現“已停止作業。關閉程式”的字樣。代碼如下,請給予指導:
public partial class Form1 : Form
{
Socket m_socket; //服務器端socket
bool m_bListening;
bool m_AlreadyBound;
IPEndPoint m_ipe;
public delegate void ReceiveMessageDelegate(Client client);
ReceiveMessageDelegate receiveMessageDelegate;
Thread m_thread;
private void button2_Click(object sender, EventArgs e) //start listening
{
m_bListening = true;
StartButton.Enabled = false;
StopButton.Enabled = true;
int portNumber = int.Parse(textBox1.Text);
m_ipe = new IPEndPoint(IPAddress.Any, portNumber);//用指定的埠和ip初始化IPEndPoint類的新實體
m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
if (!m_AlreadyBound)
{
m_socket.Bind(m_ipe); //系結EndPoint對像(例如:3000埠和ip地址)
//m_socket.Listen(0); //開始監聽
m_socket.Listen(50); //最大連接數
m_AlreadyBound = true;
}
m_thread = new Thread(new ThreadStart(Listening));
m_thread.Start();
}
void Listening()
{
while (true)
{
Client client = new Client();
if (null != client.ClientSocket)
{
client.ClientSocket.Shutdown(SocketShutdown.Receive);
client.ClientSocket.Shutdown(SocketShutdown.Both);
client.ClientSocket.Close();
}
client.ClientSocket = m_socket.Accept();//為新建連接創建新的socket
ConnectedLabel.Enabled = true;
receiveMessageDelegate = new ReceiveMessageDelegate(ReceiveMessages);
receiveMessageDelegate.BeginInvoke(client, ReceiveMessagesCallback, "");
}
}
private void ReceiveMessagesCallback(IAsyncResult AR)
{
receiveMessageDelegate.EndInvoke(AR);
}
private void ReceiveMessages(Client client)
{
byte[] receiveBuffer = new byte[1024];
for (int i = 0; i < 1024; i++)
receiveBuffer[i] = (byte)'\0';
try
{
while (0 == client.ClientSocket.Receive(receiveBuffer))
{
}
}
catch (Exception ex)
{
}
string strReceiveData = System.Text.UTF8Encoding.UTF8.GetString(receiveBuffer).TrimEnd('\0');
if ( !string.IsNullOrWhiteSpace(strReceiveData) )
{
textBox2.AppendText(strReceiveData + System.Environment.NewLine);
}
... ....
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/136839.html
標籤:網絡通信
