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.设计窗体,编写窗体事件代码
现在我们开始设计窗体,我已经设计好了,现在可以先进行一下预览:











