我正在学习C#中的套接字,成功编写了一个基本的两个人聊天程序后,我决定继续开发多人聊天室,其中有一个服务器和X个客户端。
现在,即使只连接了一个客户端,也会出现问题。一旦客户端连接,服务器和客户端都会收到消息“Another client connected”或“Connected to server”。他们点击确定的同时,客户端的程序崩溃,随后是服务器的(我会先处理断开连接问题,但我想先让它工作起来)。正如您从标题中猜到的那样,我得到的唯一信息是“第一次机会异常”,即使在Google或者读这里之后,我仍然无法阻止它的发生,也无法理解它为什么会发生。
以下是调试器输出中的两行:
在 mscorlib.dll 中发生了类型为 'System.FormatException' 的第一次机会异常
程序“[6808] Chat - sockets.vshost.exe: Managed (v4.0.30319)”已退出,代码为 0 (0x0)。
尝试使用try-catch捕获此异常没有效果。就像我之前说的,即使在调试模式下,程序也会崩溃,而不显示错误信息。
以下是代码:
客户端连接回调函数:
private void ClientConnectCallback(IAsyncResult res)
{
serverSocket.EndConnect(res);
MessageBox.Show("Server connected.");
serverSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ClientRecieveCallback), null);
}
buffer是一个本地变量,是一个1000字节大小的字节数组。serverSocket是我们使用“BeginConnect”方法的套接字。
这是服务器接受客户端回调函数:
private void ServerAcceptCallback(IAsyncResult res)
{
//Recieving the socket.
Socket tempSocket = localHost.EndAccept(res);
//Creating a new buffer for it.
byte[] tempBuffer = new byte[1000];
//Adding the socket to the array.
Socket[] tempArray = clients;
clients = new Socket[tempArray.Length + 1];
Array.Copy(tempArray, clients, tempArray.Length);
clients[clients.Length - 1] = tempSocket;
//Adding the buffer to the list.
buffers.Add(tempBuffer);
MessageBox.Show("Another client connected");
//Begin receive data.
tempSocket.BeginReceive(tempBuffer, 0, tempBuffer.Length, SocketFlags.None, new AsyncCallback(ServerRecieveCallback), null);
localHost.BeginAccept(new AsyncCallback(ServerAcceptCallback), null);
numOfPpl++;
ServerSend("~~~NumOfPpl:" + numOfPpl);
}
localHost
是一个套接字,我们将其绑定到端口,以及任何地址,然后调用Listen(0)。 tempBuffer
是一个新的字节数组,我们为此连接创建它作为缓冲区。 clients
是一个套接字数组,包含服务器的客户端。 buffers
是客户端缓冲区的列表。
numOfPpl是当前会话中的人数,通过调用ServerSend并发送文本"~~~NumOfPpl:",客户端将接收到下一个数字作为人数而不是消息,并在他们的计算机上相应更改。
希望我表述清楚了,这是我的第一个问题。
实际上,即使是一条可以帮助我进一步了解的信息(因为我现在没有尝试其他方法了),也会很有帮助。