我有一个聊天室应用程序,它完全正常工作但是当客户端断开连接时,插座仍然打开,很快就会填充30个插槽,因此没有更多的客户端可以连接,我在黑暗中试图找到当断开连接按钮被调用时,连接的每个套接字客户端的索引ip断开它们但是我不知道如何实际执行此操作,因为它存储在套接字阵列中而不是存储在数组中 .
这是我的服务器上要断开套接字/客户端的部分 .
public AsyncCallback pfnWorkerCallBack;
private Socket m_mainSocket;
private Socket[] m_workerSocket = new Socket[30];
private int m_clientCount = 0;
public System.Net.Sockets.Socket m_currentSocket;
public byte[] dataBuffer = new byte[1024];
string NickName;
public void OnDataReceived(IAsyncResult asyn)
{
try
{
SocketPacket socketData = (SocketPacket)asyn.AsyncState;
int iRx = 0;
// Complete the BeginReceive() asynchronous call by EndReceive() method
// which will return the number of characters written to the stream
// by the client
iRx = socketData.m_currentSocket.EndReceive(asyn);
char[] chars = new char[iRx + 1];
System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
int charLen = d.GetChars(socketData.dataBuffer,
0, iRx, chars, 0);
System.String szData = new System.String(chars);
string text = (szData);
string temp = szData.Substring(0, 10);
if (temp == "Disconnect")
{
int bum = szData.Length-12;
temp = szData.Substring(11, bum);
int no = // find the index of the ip
m_clientCount --;
ArrayList temparray = new ArrayList();
temparray.AddRange(m_workerSocket.ToArray());
temparray.RemoveAt(no);
temparray.Add(null);
int i = 0;
foreach (Socket content in temparray)
{
m_workerSocket[i] = content;
i++;
}
}
else
{
Object objData = text;
byte[] byData = System.Text.Encoding.ASCII.GetBytes(objData.ToString());
for (int i = 0; i < m_clientCount; i++)
{
if (m_workerSocket[i] != null)
{
if (m_workerSocket[i].Connected)
{
m_workerSocket[i].Send(byData);
}
}
}
Invoke(new Action(() => richTextBoxSendMsg.AppendText(szData)));
Invoke(new Action(() => richTextBoxSendMsg.AppendText(Environment.NewLine)));
// Continue the waiting for data on the Socket
WaitForData(socketData.m_currentSocket);
}
}
catch (ObjectDisposedException)
{
System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: Socket has been closed\n");
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
和Disconnect呼叫的客户端
private void buttonDisconnect_Click(object sender, EventArgs e)
{
Object objData = "Disconnect " + GetIP();
byte[] byData = System.Text.Encoding.ASCII.GetBytes(objData.ToString());
if (m_clientSocket != null)
{
m_clientSocket.Send(byData);
txtBoxMsg.Clear();
}
if (m_clientSocket != null)
{
m_clientSocket.Close();
m_clientSocket = null;
UpdateControls(false);
}
}
我希望这是足够的信息,因为我真的很想知道如何做到这一点..感谢您的任何和所有输入/建设性的批评 .
1 回答
试试这个: