0

我正在使用 TCP/IP 进行聊天项目。当客户端连接时,他收到一条消息,但在断开连接并再次连接后,他没有收到消息。我检查并看到重新连接后 Action 方法和 Invoke 方法不起作用。你能帮助我吗?

这是客户端代码

namespace Client{
  public partial class frmClient : Form
  {
    private TcpClient tcpClient;
    private Comm comm;


    public frmClient()
    {
        InitializeComponent();
        txtNickName.Focus();
    }

    private void btnConnect_Click(object sender, EventArgs e)
    {

        tcpClient = new TcpClient("127.0.0.1", 8200);
        MessageBox.Show("tcpClient = new TcpClient(127.0.0.1, 8200)");
        comm = new Comm();
        comm.GotMessage += new MessageHandler(comm_GotMessage);
        MessageBox.Show("comm.GotMessage += new MessageHandler(comm_GotMessage)");
       // comm.GotMessage += comm_GotMessage;
        comm.Connect(tcpClient.Client);
        MessageBox.Show("comm.Connect(tcpClient.Client)");
        disconnectToolStripMenuItem.Enabled = true;
        btnConnect.Enabled = false;
        grbChat.Enabled = true;
        grbNickName.Enabled = false;
        comm.Send(new ConnectMessage(txtNickName.Text));
        MessageBox.Show("comm.Send(new ConnectMessage(txtNickName.Text))");
        txtMessage.Focus();
        // lstUsers.Items.Add(txtNickName.Text);

    }

   *****This part is the one who doesn't work after reconnecting*****


    private void comm_GotMessage(object sender, MessageEventArgs e)
    {
        ***Action<BaseMessage> add = addMessage;
        MessageBox.Show(" Action<BaseMessage> add = addMessage");
        Invoke(add, e.BaseM);
        MessageBox.Show(" Invoke(add, e.BaseM)");***
        lstMessages.EnsureVisible(lstMessages.Items.Count - 1);

    }

    private void addMessage(BaseMessage baseM)
    {
        ListViewItem lvi = new ListViewItem();
        lvi.ForeColor = baseM.Color;
        lvi.Font = baseM.Font;
        lvi.Text = baseM.Message;
        lstMessages.Items.Add(lvi);
    }


    private void txtNickName_TextChanged(object sender, EventArgs e)
    {
        if (txtNickName != null)
            btnConnect.Enabled = true;

        return;
    }


    private void btnSend_Click(object sender, EventArgs e)
    {
        comm.Send(new ChatMessage(txtMessage.ForeColor,txtMessage.Font,txtNickName.Text,txtMessage.Text));
        MessageBox.Show("comm.Send(new ChatMessage(txtMessage.ForeColor,txtMessage.Font,txtNickName.Text,txtMessage.Text))");
        if(lstMessages.Items.Count>1)
        lstMessages.EnsureVisible(lstMessages.Items.Count - 1);


        txtMessage.Clear();
        txtMessage.Focus();
    }


    private void txtMessage_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)13)
        {
            comm.Send(new ChatMessage(txtMessage.ForeColor, txtMessage.Font, txtNickName.Text, txtMessage.Text));
            MessageBox.Show("comm.Send(new ChatMessage(txtMessage.ForeColor, txtMessage.Font, txtNickName.Text, txtMessage.Text))");
            lstMessages.EnsureVisible(lstMessages.Items.Count - 1);
            txtMessage.Clear();
            txtMessage.Focus();
        }
    }


    private void btnChangeColor_Click(object sender, EventArgs e)
    {
        DialogResult dr = colorDialog1.ShowDialog();
        if (dr == DialogResult.OK)
        {
            txtMessage.ForeColor = colorDialog1.Color;
            txtMessage.Focus();
        }
    }


    private void btnChangeFont_Click(object sender, EventArgs e)
    {
        DialogResult dr = fontDialog1.ShowDialog();
        if (dr == DialogResult.OK)
        {
            txtMessage.Font = fontDialog1.Font;
            txtMessage.Focus();
        }
    }


    private void disconnectToolStripMenuItem_Click(object sender, EventArgs e)
    {
        comm.Send(new ChatMessage(Color.DarkRed, txtMessage.Font, txtNickName.Text, " has been DISCONNECTED..."));
        MessageBox.Show("comm.Send(new ChatMessage(Color.DarkRed, txtMessage.Font, txtNickName.Text,  has been DISCONNECTED...))");
        txtNickName.Clear();
        lstUsers.Items.Clear();
        lstMessages.Items.Clear();
       // tcpClient.Client.Close();
        tcpClient.Close();
        MessageBox.Show("tcpClient.Close()");
        comm.Dispose();
        MessageBox.Show("comm.Dispose()");
        //tcpClient = null;
        btnConnect.Enabled = true;
        disconnectToolStripMenuItem.Enabled = false;
        grbChat.Enabled = false;
        grbNickName.Enabled = true;
        //LingerState.Enabled = true;
        //tcpClient.LingerState = new LingerOption(true, 10);


    }


    private void exitToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Close();
    }
4

0 回答 0