?? chatserver.cs
字號:
?/*
* 名稱: 基于UDP廣播的小型聊天室
* 作者: kingthy
* MSN : kingthy@gmail.com
* 博客: http://kingthy.cnblogs.com
* 說明: 你可以對代碼進行任意的修改.如果你對程序進行了功能擴充,希望您能發一份新代碼給我.謝謝:)
*
* */
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace Kingthy.UDPChatRoom.Service
{
/// <summary>
/// 聯天服務器端,用于接收消息
/// </summary>
public class ChatServer
: IDisposable
{
/// <summary>
///
/// </summary>
public ChatServer()
{
this.IsStarting = false;
this.Server = new UdpClient(Port, AddressFamily.InterNetwork);
this.OnDataReceiveCallBack = new AsyncCallback(OnDataReceive);
}
/// <summary>
/// 啟動服務
/// </summary>
public void Start()
{
if (IsStarting) return;
this.Server.JoinMulticastGroup(BroadcastAddress);
this.Server.BeginReceive(this.OnDataReceiveCallBack, this.Server);
IsStarting = true;
}
/// <summary>
/// 停止服務
/// </summary>
public void Stop()
{
if (!IsStarting) return;
IsStarting = false;
this.Server.DropMulticastGroup(BroadcastAddress);
this.Server.Close();
}
#region 屬性定義
/// <summary>
/// 端口定義
/// </summary>
public static readonly int Port = 65432;
/// <summary>
/// 廣播地址
/// </summary>
public static readonly IPAddress BroadcastAddress = IPAddress.Parse("224.224.224.224");
/// <summary>
/// UdpClient
/// </summary>
private UdpClient Server;
/// <summary>
/// 服務是否已啟動
/// </summary>
private bool IsStarting;
#endregion
#region IDisposable 成員
/// <summary>
/// 釋放內存
/// </summary>
public void Dispose()
{
this.Stop();
this.Server = null;
}
#endregion
#region 事件
/// <summary>
///
/// </summary>
private AsyncCallback OnDataReceiveCallBack;
/// <summary>
/// 接收到數據時的激發的事件
/// </summary>
public event EventHandler<ChatServerDataReceiveEventArgs> DataReceive;
/// <summary>
/// 接收數據的事件
/// </summary>
/// <param name="async"></param>
private void OnDataReceive(IAsyncResult async)
{
if (!this.IsStarting) return; //已關閉服務
UdpClient server = null;
try
{
server = (UdpClient)async.AsyncState;
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
byte[] buffer = server.EndReceive(async, ref remoteEP);
//通知上一層
EventHandler<ChatServerDataReceiveEventArgs> handler = this.DataReceive;
if (handler != null) handler(server, new ChatServerDataReceiveEventArgs(remoteEP, buffer));
}
catch (ObjectDisposedException)
{
//已被釋放了資源數據
server = null;
}
catch { }
finally
{
//繼續接收數據
if (this.IsStarting && server != null)
server.BeginReceive(this.OnDataReceiveCallBack, server);
}
}
#endregion
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -