?? roomform.cs
字號:
?/*
* 名稱: 基于UDP廣播的小型聊天室
* 作者: kingthy
* MSN : kingthy@gmail.com
* 博客: http://kingthy.cnblogs.com
* 說明: 你可以對代碼進行任意的修改.如果你對程序進行了功能擴充,希望您能發一份新代碼給我.謝謝:)
*
* */
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using Kingthy.UDPChatRoom.Service;
using Kingthy.UDPChatRoom.Service.Message;
namespace Kingthy.UDPChatRoom
{
public partial class RoomForm : Form
{
public RoomForm()
{
//初始化聊天室數據
this.Server = new ChatServer();
this.Client = new ChatClient();
this.Server.DataReceive += new EventHandler<ChatServerDataReceiveEventArgs>(Server_DataReceive);
//啟動服務
this.Server.Start();
InitializeComponent();
this.FormClosing += new FormClosingEventHandler(RoomForm_FormClosing);
this.MessageText.KeyDown += new KeyEventHandler(MessageText_KeyDown);
//登錄在線狀態
this.Client.Online();
//查詢用戶列表
this.Client.Query();
}
#region 窗體事件
/// <summary>
/// 窗體關閉
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void RoomForm_FormClosing(object sender, FormClosingEventArgs e)
{
//注銷
this.Client.Offline();
this.Server.Dispose();
this.Client.Dispose();
}
/// <summary>
/// 處理CTRL + Enter鍵
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MessageText_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.Enter)
{
BtnSend_Click(null, e);
//不處理Enter鍵
e.SuppressKeyPress = true;
}
}
/// <summary>
/// 發送聊天內容
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnSend_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(this.MessageText.Text))
this.Client.SendMessage(this.MessageText.Text);
this.MessageText.Text = string.Empty;
}
#endregion
#region 屬性定義
private ChatServer Server;
/// <summary>
///
/// </summary>
private ChatClient Client;
#endregion
#region 聊天服務
/// <summary>
/// 聊天服務的數據接收
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Server_DataReceive(object sender, ChatServerDataReceiveEventArgs e)
{
switch (e.MessageType)
{
case MessageType.Query:
//查詢狀態,則發送自己的身份
this.Client.SendIdentity();
break;
case MessageType.Identity:
//客戶端表明身份狀態,則加入到客戶端列表
AddClientIP(e.RemoteEP.Address.ToString());
break;
case MessageType.Online:
//有某個客戶端上線,則加入到客戶端列表
AddClientIP(e.RemoteEP.Address.ToString());
AddMessage(string.Format("## 客戶機{0}已上線...", e.RemoteEP.Address.ToString()));
break;
case MessageType.Offline:
//某個客戶端下線
RemoveClientIP(e.RemoteEP.Address.ToString());
AddMessage(string.Format("## 客戶機{0}已下線...", e.RemoteEP.Address.ToString()));
break;
case MessageType.Chat:
//消息
ChatMessagePackage package = ChatMessagePackage.FromPackage(e.Data);
AddMessage(string.Format("--------------------------------------------------------------\r\n>> {0} 于 {1} 說:\r\n{2}\r\n",
e.RemoteEP.Address.ToString(),
package.Time.ToString("yyyy-MM-dd HH:mm:ss"),
package.Message
));
break;
}
}
/// <summary>
/// 單一參數的方法代理
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="e"></param>
public delegate void DelegateDefinde<T>(T e);
/// <summary>
/// 添加IP到客戶列表
/// </summary>
/// <param name="e"></param>
private void AddClientIP(string ip)
{
if (this.ClientList.InvokeRequired)
{
this.ClientList.Invoke(new DelegateDefinde<string>(AddClientIP), ip);
}
else
{
if (!this.ClientList.Items.Contains(ip))
{
this.ClientList.Items.Add(ip);
}
}
}
/// <summary>
/// 刪除某個客戶列表
/// </summary>
/// <param name="ip"></param>
private void RemoveClientIP(string ip)
{
if (this.ClientList.InvokeRequired)
{
this.ClientList.Invoke(new DelegateDefinde<string>(RemoveClientIP), ip);
}
else
{
if (this.ClientList.Items.Contains(ip))
{
this.ClientList.Items.Remove(ip);
}
}
}
/// <summary>
/// 添加消息
/// </summary>
/// <param name="text"></param>
private void AddMessage(string text)
{
if (this.MessageOutput.InvokeRequired)
{
this.MessageOutput.Invoke(new DelegateDefinde<string>(AddMessage), text);
}
else
{
if (this.MessageOutput.Text.Length > 0)
{
this.MessageOutput.AppendText("\r\n");
}
this.MessageOutput.AppendText(text);
}
}
#endregion
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -