我在C#(WindowsForm)中开发了一个客户端/服务器应用程序来连接网络上的两台计算机。
以下是它的工作原理:
- 客户端等待服务器打开(是的,我颠倒了角色)
- 当服务器打开时,客户端到达连接
问题在于:如果我在连接期间关闭服务器,则客户端保持连接。
这是一个问题,因为当我关闭服务器(并且客户端保持连接)时,如果我重新打开服务器,则客户端不再连接,因为它仍然连接到前一个套接字(我关闭的服务器)
我希望客户端(以及服务器)能够在另一个套接字断开连接时 DETECT ,当发生这种情况时,我希望客户端重新侦听传入连接(因为它是第一次)。
以下是客户端的源代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Diagnostics;
namespace _Client
{
public partial class Form1 : Form
{
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Thread connection = new Thread(new ThreadStart(DoWork));
connection.Start();
}
private void DoWork()
{
ListenForIncomingConnection();
try
{
byte[] clientRequest = new byte[1024];
while (true)
{
int sizeOfRequest = client.Receive(clientRequest);
byte[] Request = new byte[sizeOfRequest];
Array.Copy(clientRequest, Request, sizeOfRequest);
string _stringRequest = Encoding.ASCII.GetString(Request);
// if the server sends a disconnecting message...
if(_stringRequest == "disconnecting")
{
client.Close();
}
}
}
catch (Exception Ex)
{
MessageBox.Show(Ex.ToString());
DoWork();
}
}
private void ListenForIncomingConnection()
{
try
{
client.Connect("x.xxx.xxx.xxx", 27018);
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
ListenForIncomingConnection();
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
client.Close();
}
}
}
当服务器断开连接时,客户端将关闭与client.Close()的连接。之后,客户端尝试重新连接到服务器,我收到此错误:无法访问已处置的对象 这是因为,在客户端尝试重新连接之前,我关闭了与client.Close()的连接。
如何解决?
答案 0 :(得分:0)
“关闭服务器时”是什么意思?如果关闭服务器套接字,客户端应该注意到。如果您在不调用套接字上的Close的情况下结束服务器进程,则客户端无法注意到这一点,因为您正在跳过TCP的连接终止。