分享一个C#编写简单的聊天程序(详细介绍)

2019-12-26 16:55:38刘景俊

3.实现Talker类

Talker类是最平庸的一个类,它的全部功能就是将操作委托给实际的IMessageReceiver和IMessageSender。定义这两个接口的好处也从这里可以看出来:如果日后想重新实现这个程序,所有Windows窗体的代码和Talker的代码都不需要修改,只需要针对这两个接口编程就可以了。


public class Talker {
 private IMessageReceiver receiver;
 private IMessageSender sender;

 public Talker(IMessageReceiver receiver, IMessageSender sender) {
  this.receiver = receiver;
  this.sender = sender;
 }

 public Talker() {
  this.receiver = new MessageReceiver();
  this.sender = new MessageSender();
 }

 public event MessageReceivedEventHandler MessageReceived {
  add {
  receiver.MessageReceived += value;
  }
  remove {
  receiver.MessageReceived -= value;
  }
 }

 public event ClientConnectedEventHandler ClientConnected {
  add {
  receiver.ClientConnected += value;
  }
  remove {
  receiver.ClientConnected -= value;
  }
 }

 public event ConnectionLostEventHandler ClientLost {
  add {
  receiver.ClientLost += value;
  }
  remove {
  receiver.ClientLost -= value;
  }
 }

 // 注意这个事件
 public event PortNumberReadyEventHandler PortNumberReady {
  add {
  ((MessageReceiver)receiver).PortNumberReady += value;
  }
  remove {
  ((MessageReceiver)receiver).PortNumberReady -= value;
  }
 }
  

 // 连接远程 - 使用主机名
 public bool ConnectByHost(string hostName, int port) {
  IPAddress[] ips = Dns.GetHostAddresses(hostName);
  return sender.Connect(ips[0], port);
 }

 // 连接远程 - 使用IP
 public bool ConnectByIp(string ip, int port) {
  IPAddress ipAddress;
  try {
  ipAddress = IPAddress.Parse(ip);
  } catch {
  return false;
  }
  return sender.Connect(ipAddress, port);
 }


 // 发送消息
 public bool SendMessage(Message msg) {
  return sender.SendMessage(msg);
 }

 // 释放资源,停止侦听
 public void Dispose() {
  try {
  sender.SignOut();
  receiver.StopListen();
  } catch {
  }
 }

 // 注销
 public void SignOut() {
  try {
  sender.SignOut();
  } catch {
  }
 }
 }

4.设计窗体,编写窗体事件代码

现在我们开始设计窗体,我已经设计好了,现在可以先进行一下预览:

分享一个C#编写简单的聊天程序(详细介绍)

分享一个C#编写简单的聊天程序(详细介绍)