public partial class PrimaryForm : Form
{
private Talker talker;
private string userName;
public PrimaryForm(string name)
{
InitializeComponent();
userName = lbName.Text = name;
this.Text = userName + " Talking ...";
talker = new Talker();
talker.ClientLost += talker_ClientLost;
talker.ClientConnected += talker_ClientConnected;
talker.MessageReceived += talker_MessageReceived;
talker.PortNumberReady += PrimaryForm_PortNumberReady;
}
void PrimaryForm_PortNumberReady(int port)
{
lbPort.Invoke((Action)(() => lbPort.Text = port.ToString()));
}
void talker_MessageReceived(string msg)
{
txtContent.Invoke((Action)(() => txtContent.Text += msg));
}
void talker_ClientConnected(IPEndPoint ep)
{
txtContent.Invoke((Action)(() =>
{
IPHostEntry host = Dns.GetHostEntry(ep.Address);
txtContent.Text += String.Format("System[{0}]:\r\n遠端主機 {1} 連線至本地。\r\n", DateTime.Now, ep);
}));
}
void talker_ClientLost(string info)
{
txtContent.Invoke((Action)(() =>
txtContent.Text += String.Format("System[{0}]:\r\n{1}\r\n", DateTime.Now, info)));
}
private void btnSend_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(txtMessage.Text))
{
MessageBox.Show("請輸入內容!");
txtMessage.Focus(); return;
}
Message msg = new Message(userName, txtMessage.Text);
if (talker.SendMessage(msg))
{
txtContent.Text += msg.ToString();
txtMessage.Clear();
}
else
{
txtContent.Text += String.Format("System[{0}]:\r\n遠端主機已斷線\r\n", DateTime.Now);
DisconnectStatus();
}
}
private void btnConnect_Click(object sender, EventArgs e)
{
string host = txtHost.Text;
if (string.IsNullOrEmpty(host)) { MessageBox.Show("主機名稱不可空"); return; }
if (!int.TryParse(txtPort.Text, out int port)) { MessageBox.Show("連接埠需為數字"); return; }
if (talker.ConnectByHost(host, port) || talker.ConnectByIp(host, port))
{
ConnectStatus();
txtContent.Text += String.Format("System[{0}]:\r\n已連線至遠端\r\n", DateTime.Now);
}
else MessageBox.Show("遠端主機不存在或拒絕連線");
txtMessage.Focus();
}
private void btnClose_Click(object sender, EventArgs e) { talker.Dispose(); Application.Exit(); }
private void PrimaryForm_FormClosing(object sender, FormClosingEventArgs e) { talker.Dispose(); Application.Exit(); }
private void btnSignout_Click(object sender, EventArgs e) { talker.SignOut(); DisconnectStatus(); txtContent.Text += String.Format("System[{0}]:\r\n已登出\r\n", DateTime.Now); }
private void btnClear_Click(object sender, EventArgs e) { txtContent.Clear(); }
}
SignOut() 僅斷線;Dispose() 釋放資源並結束應用程式。