C#多用户Tcp / Ip聊天应用程序

问题描述 投票:0回答:1

我打算编写一个可以作为服务器或客户端使用的C#应用​​程序。我实现了两个WinForm。第一个叫做ServerChat,在加载时调用backgroundWorker

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    serverSocket.Start();
    try
    {
        clientSocket = serverSocket.AcceptTcpClient();
        backgroundWorker1.ReportProgress(0, clientSocket);
    }
    catch (Exception exp)
    {
        throw exp;
    }
}

private void backgroundWorker1_ProgressChanged(object sender,
    System.ComponentModel.ProgressChangedEventArgs e)
{
    if (e.UserState!=null)
    {
        try
        {
            frmChatClient = new frmChatClient("server", clientSocket);
            frmChatClient.Show();
        }
        catch (Exception exp)
        {
            throw exp;
        }
    }
}

正如您所看到的那样,当接受连接时,frmChatClient已经显示哪个有自己的backgroundWorker用于之前传递的读取套接字。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    byte[] bytesFrom = new byte[10025];

    while (true)
    {
        try
        {
           // in this line clientSocket is connected
            this.networkStream = clientSocket.GetStream();

           // this line throw exeotion
           networkStream.Read(bytesFrom, 0, textbox1.MaxLength);

            dataFromClient = System.Text.Encoding.BigEndianUnicode.GetString(bytesFrom);

            backgroundWorker1.ReportProgress(0,dataFromClient);
           // break;
        }
        catch (Exception ex)
        {
            throw ex;

        }
    }
}

尝试读取或写入后,我收到以下错误消息

无法从传输连接读取数据:远程主机强制关闭现有连接。

c# tcp backgroundworker
1个回答
2
投票

连接已关闭,因为未生成任何流量。如果是这样,套接字将关闭连接。

TcpClient设计用于发送/接收然后关闭。它的底层套接字没有灵活性。您可以使用AcceptSocket来获取已接受的连接,而不是AcceptTcpClient,然后使用TCP keep alive让连接保持通信。或者,如果要使用TcpClient,请务必发送keep alive包。

在您的协议上,您可以提供具有小占用空间负载的ALIVE数据包,以通知服务器和客户端连接仍然正常且清晰。发送这些类型的数据包而不是标准的TCP Keep Alive有利有弊。但肯定会让您的客户保持联系。

© www.soinside.com 2019 - 2024. All rights reserved.