玄機論壇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#)
