我的客户端登陆的时候显示已经进入系统,但是服务端在进行Socket.beginReceive的时候报错,无法访问已释放的对象。对象名:“System.Net.Sockets.Socket”。
代码如下:
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
txtIP.Text = "10.30.62.49" ;
txtPort.Text = "4001";
}
private void button2_Click(object sender, EventArgs e)
{
try
{
if (txtIP.Text != "" && txtPort.Text != "")
{
ip = IPAddress.Parse(txtIP.Text.Trim());
port = int.Parse(txtPort.Text.Trim());
ServerInfo = new IPEndPoint(ip, port);
}
else
{
MessageBox.Show("请将IP和端口都填写完整!");
return;
}
flag = true;
ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ServerSocket.Bind(ServerInfo); //绑定
ServerSocket.Listen(10); //监听
ClientSocket = new Socket[65535]; //套接字
MsgBuffer = new byte[65535];
ClientNumb = 0;
userInfo = new string[65535];
ServerThread = new Thread(RecieveAccept);
ServerThread.IsBackground = true;
ServerThread.Start();
SkManThread = new Thread(SkManager); //发送线程
SkManThread.IsBackground = true;
SkManThread.Start();
CheckForIllegalCrossThreadCalls = false;
this.btnstart.Enabled = false;
this.btnstop.Enabled = true;
}
catch (Exception ex)
{ throw ex; }
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult dr = MessageBox.Show("确定要退出程序吗?", "退出提示", MessageBoxButtons.OKCancel);
if (dr.Equals(DialogResult.OK))
{
// Application.Exit();
}
else
{
e.Cancel = true;
}
}
private void RecieveAccept()
{
while (true)
{
try
{
ClientSocket[ClientNumb] = ServerSocket.Accept();
ClientSocket[ClientNumb].BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(RecieveCallBack), ClientSocket[ClientNumb]);
this.txtnew.AppendText(ClientSocket[ClientNumb].RemoteEndPoint.ToString() + " 成功连接服务器." + "\n");
this.listBox1.Items.Add(ClientSocket[ClientNumb].RemoteEndPoint.ToString());
userInfo[ClientNumb] = ClientNumb.ToString();
userInfo[ClientNumb] += ClientSocket[ClientNumb].RemoteEndPoint.ToString();
ClientNumb++;
this.label4.Text = ClientNumb.ToString();
}
catch
{
}
}
}
private void RecieveCallBack(IAsyncResult AR)
{
try
{
if (flag)
{
if ( (Socket)AR.AsyncState != null)
{
Socket RSocket = (Socket)AR.AsyncState;
int REnd = RSocket.EndReceive(AR);
this.txtnew.AppendText(Encoding.Default.GetString(MsgBuffer, 0, REnd) + "\n");
RSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(RecieveCallBack), RSocket);
}
}
}
catch (Exception ex)
{
return;
}
}
private void SkManager()
{
try
{
while (true)
{
Thread.Sleep(2000);
#region 将消息轮发给所有在线用户
for (int j = 0; j < ClientNumb; j++)
{
if (!ClientSocket[j].Connected && ClientSocket[j]!= null)
{
this.listBox1.Items.Remove(ClientSocket[j].RemoteEndPoint.ToString());
this.txtnew.AppendText(ClientSocket[j].RemoteEndPoint.ToString() + "断开与服务器的连接!\n");
ClientSocket[j].Close();
ClientSocket[j].Dispose();
ClientNumb = ClientNumb - 1;
this.label4.Text = ClientNumb.ToString();
}
else
{
ClientSocket[j].Send(Encoding.Default.GetBytes("服务器:1122" + "\n"));
this.txtnew.AppendText("服务器:" + "1122" + "\n");
}
}
#endregion
}
}
catch(Exception ex)
{ throw ex; }
}
private void btnstop_Click(object sender, EventArgs e)
{
try
{
//flag = false;
ServerThread.Abort();
SkManThread.Abort();
ServerSocket.Close();
ServerSocket.Dispose();
for (int i = 0; i < ClientNumb; i++)
{
if (ClientSocket[i].Connected)
{
ClientSocket[i].Close();
}
}
}
catch { }
flag = false;
this.btnstart.Enabled = true;
this.btnstop.Enabled = false;
this.listBox1.Items.Clear();
}