C# 当客户端断开连接时关闭套接字,以便可以重用它#
我有一个聊天室应用程序,它可以正常工作,但是当客户端断开连接时,套接字保持打开状态,很快30个套接字就被填满了,因此没有更多的客户端可以连接,我曾经在黑暗中尝试寻找每个套接字客户机的索引ip,当调用disconnect按钮时,这些套接字客户机连接到断开连接,但我不知道如何实际执行此操作,因为它存储在套接字数组中,而不是数组中 这是我服务器上要断开套接字/客户端连接的部分C# 当客户端断开连接时关闭套接字,以便可以重用它#,c#,arrays,winforms,sockets,C#,Arrays,Winforms,Sockets,我有一个聊天室应用程序,它可以正常工作,但是当客户端断开连接时,套接字保持打开状态,很快30个套接字就被填满了,因此没有更多的客户端可以连接,我曾经在黑暗中尝试寻找每个套接字客户机的索引ip,当调用disconnect按钮时,这些套接字客户机连接到断开连接,但我不知道如何实际执行此操作,因为它存储在套接字数组中,而不是数组中 这是我服务器上要断开套接字/客户端连接的部分 public AsyncCallback pfnWorkerCallBack; private Socket
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);
}
}
我希望这是足够的信息,因为我真的知道如何做到这一点。。
感谢您提供的所有意见/建设性的批评。试试这个:
var clientSocket = (Socket)asyn.AsyncState;
for (int i = 0; i < m_workerSocket.Count(); i++)
{
if (m_workerSocket[i] == clientSocket)
{
var sockets = new List<Socket>(m_workerSocket);
sockets.RemoveAt(i);
m_workerSocket = sockets.ToArray();
break;
}
}
clientSocket.Close()
var clientSocket=(Socket)asyn.AsyncState;
对于(int i=0;i
我已经实现了您建议的代码,但返回时出现了两个错误。第一个错误是错误2“System.Array”不包含“RemoteAt”的定义,并且找不到接受类型为“System.Array”的第一个参数的扩展方法“RemoteAt”。错误1接线员“对不起,有几个打字错误。。。我编辑了代码来修复它们编辑修复了一个问题,但它仍然声称。RemoveAt不是系统的定义。数组很糟糕,但这比以前更接近于完成我的聊天室。我明白了,忘记了我使用了RemoveAt的扩展方法。太棒了,新编辑成功了。非常感谢您抽出时间,非常感谢。
var clientSocket = (Socket)asyn.AsyncState;
for (int i = 0; i < m_workerSocket.Count(); i++)
{
if (m_workerSocket[i] == clientSocket)
{
var sockets = new List<Socket>(m_workerSocket);
sockets.RemoveAt(i);
m_workerSocket = sockets.ToArray();
break;
}
}
clientSocket.Close()