当另一个插座不再可用时,C#Socket保持连接状态

时间:2015-10-04 09:44:20

标签: c# sockets server client

我在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()的连接。

如何解决?

1 个答案:

答案 0 :(得分:0)

“关闭服务器时”是什么意思?如果关闭服务器套接字,客户端应该注意到。如果您在不调用套接字上的Close的情况下结束服务器进程,则客户端无法注意到这一点,因为您正在跳过TCP的连接终止。