玄機論壇Socket類庫源碼+Demo
本類庫采用C# TcpLister,TcpClient高度封裝,
采用C# NetworkStream進行異步模式讀取數據.
采用C# Semaphore來進行並發控制,
我使用的是同步方式連接,海量數據並發不是靠異步就能解決的問題,在對學習Socket和想快速使用Socket的朋友來說,同步是很好的選擇.
使用IOCP的Socket類正在測試階段,穩定,排除BUG后一樣會分享給大家.
可同時接受5000+連接同時訪問,而CPU消耗完全忽略不計..
本着代碼簡潔,簡單.通俗易懂的原則,進行代碼封裝,不像其他通信框架寫很多各式各樣的接口.對新手朋友和剛接觸通信程序的朋友帶來很大的困擾.
本代碼完全開源,但請保留署名,以示尊重.!
下面我和大家一起來分享這個類庫的使用方式.
服務端的調用
先來看下服務端的界面
<ignore_js_op>
第一個列表框用來獲取服務端狀態信息.
第二個列表框用來獲取客戶端發來的消息.
一個下來列表框來記錄客戶端上線.邊上的0來記錄當前連接數
界面非常簡潔,咱們來看類庫的使用方式.
第一步,引入命名空間
當引用xuanjiSocket類庫以后,請添加
1
|
using
XuanJiSocket;
|
添加服務端類.如果沒有引入命名空間,那么可以將鼠標光標置於類變量中,按快捷鍵 Shift + Alt + F10 自動引入類庫命名空間
1
|
SocketHelper.TcpServer server;
|
1
2
3
4
5
|
private
void
ServerDemo_Load(
object
sender, EventArgs e)
{
server =
new
SocketHelper.TcpServer();
//初始化變量
}
|
在窗體加載事件中,完成對server變量的初始化.
SocketHelper.pushSockets = new SocketHelper.PushSockets(Rec);
這是本類非常重要的委托變量.
它的作用就是推送所有信息.!請在Start前對其初始化.!
1
2
3
|
private
void
Rec(SocketHelper.Sockets sks)
{
}
|
這是處理推送器消息的方法.!
SocketHelper.Sockets
大家可以看下這個自定義對象
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
/// <summary>
/// 自定義Socket對象
/// </summary>
public
class
Sockets
{
/// <summary>
/// 接收緩沖區
/// </summary>
public
byte
[] RecBuffer =
new
byte
[8 * 1024];
/// <summary>
/// 發送緩沖區
/// </summary>
public
byte
[] SendBuffer =
new
byte
[8 * 1024];
/// <summary>
/// 異步接收后包的大小
/// </summary>
public
int
Offset {
get
;
set
; }
/// <summary>
/// 空構造
/// </summary>
public
Sockets() { }
/// <summary>
/// 創建Sockets對象
/// </summary>
/// <param name="ip">Ip地址</param>
/// <param name="client">TcpClient</param>
/// <param name="ns">承載客戶端Socket的網絡流</param>
public
Sockets(IPEndPoint ip, TcpClient client, NetworkStream ns)
{
Ip = ip;
Client = client;
nStream = ns;
}
/// <summary>
/// 當前IP地址,端口號
/// </summary>
public
IPEndPoint Ip {
get
;
set
; }
/// <summary>
/// 客戶端主通信程序
/// </summary>
public
TcpClient Client {
get
;
set
; }
/// <summary>
/// 承載客戶端Socket的網絡流
/// </summary>
public
NetworkStream nStream {
get
;
set
; }
/// <summary>
/// 發生異常時不為null.
/// </summary>
public
Exception ex {
get
;
set
; }
/// <summary>
/// 新客戶端標識.如果推送器發現此標識為true,那么認為是新的連接
/// </summary>
public
bool
NewClientFlag {
get
;
set
; }
}
|
每個屬性都有注釋,來解釋這個屬性的作用..具體處理細節.請下載demo閱讀
上面那些信息絕非無用,而是整個類的重中之重以及消息處理方式.
啟動類庫,並開始監聽
1
2
|
server.InitSocket(IPAddress.Any, 9527);
//監聽所有地址,監聽端口為9527
server.Start();
//啟動服務端
|
之前在窗體加載時已經初始化過變量,現在直接使用它的InitSocket來配置服務端.使用Start方法啟動監聽.!
默認調用后便認為監聽成功.!
如若其他情況,例如異常時: 會推送監聽失敗消息至服務端Rev方法中.具體參閱源碼.
停止服務端
直接調用Stop方法即可停止服務端.Stop方法調用后,可繼續啟動服務端.!
至此,服務端的描述就介紹完了,使用非常簡單,
你要做的就下面幾件事:
1 、 聲明服務端變量。
2 、 初始化推送器。
3 、 配置服務端。
4 、 啟動服務端
服務端發送信息
服務端有兩個自帶方法
1
|
server.SendToAll(
"服務端消息:[url=http://www.msdn5.com]www.msdn5.com[/url] 隨機消息:"
+Guid.NewGuid().ToString());//直接發送字符串
|
該方法將會對所有連接至服務端的客戶端發送消息.如果在發送中客戶端下線或發生異常,服務端將維護客戶端集合 ClientList
ClientList 會在客戶端接入時添加.如果發生異常等情況會自動刪除
1
|
SendToClient(IPEndPoint ip,
string
SendData);
|
像單獨某位客戶發起數據.
當客戶端連接時,除去ClientList會自動維護列表外,也會將客戶端推送至UI界面,供大家組合自己想要的客戶端列表.詳細請閱讀demo
客戶端介紹
<ignore_js_op>
客戶端與服務端一樣,需要先聲明客戶端變量,
1
|
SocketHelper.TcpClients client;
//聲明客戶端變量 與服務端一樣在窗體加載時初始化.
|
接着初始化推送器,
1
|
SocketHelper.pushSockets =
new
SocketHelper.PushSockets(Rec);
//在窗體加載時初始化推送器
|
配置客戶端,啟動客戶端.
1
2
|
client.InitSocket
(
ip
,
int.Parse
(
port
)
)
;
/
/
IP地址支持字符串類型
client.Start
(
)
;
|
客戶端發送方法,與服務端一致.調用Send方法.調用Start方法來連接服務器,調用Stop方法斷開連接.支持斷開后重新連接服務端
最后來一張運行時的截圖吧
<ignore_js_op>
Demo + 類庫下載地址:
玄機論壇Socket類庫源碼 當前版本 2.6.3 更新日期:10-09/2015
http://bbs.msdn5.com/thread-27-1-1.html
(出處: C#論壇-玄機論壇-C#論壇-玄機寶盒-玄機類庫-C#)