C# SocketHelper 源碼


玄機論壇Socket類庫源碼+Demo

本類庫采用C# TcpLister,TcpClient高度封裝,
采用C# NetworkStream進行異步模式讀取數據.
采用C# Semaphore來進行並發控制,
 
我使用的是同步方式連接,海量數據並發不是靠異步就能解決的問題,在對學習Socket和想快速使用Socket的朋友來說,同步是很好的選擇.
使用IOCP的Socket類正在測試階段,穩定,排除BUG后一樣會分享給大家.
可同時接受5000+連接同時訪問,而CPU消耗完全忽略不計..
本着代碼簡潔,簡單.通俗易懂的原則,進行代碼封裝,不像其他通信框架寫很多各式各樣的接口.對新手朋友和剛接觸通信程序的朋友帶來很大的困擾.
本代碼完全開源,但請保留署名,以示尊重.!

下面我和大家一起來分享這個類庫的使用方式.

服務端的調用


先來看下服務端的界面
<ignore_js_op> 
第一個列表框用來獲取服務端狀態信息.
第二個列表框用來獲取客戶端發來的消息.
一個下來列表框來記錄客戶端上線.邊上的0來記錄當前連接數

界面非常簡潔,咱們來看類庫的使用方式.

第一步,引入命名空間


當引用xuanjiSocket類庫以后,請添加

[C#]  純文本查看 復制代碼
?
1
using XuanJiSocket;


添加服務端類.如果沒有引入命名空間,那么可以將鼠標光標置於類變量中,按快捷鍵 Shift + Alt + F10 自動引入類庫命名空間

[C#]  純文本查看 復制代碼
?
1
SocketHelper.TcpServer server;

 

[C#]  純文本查看 復制代碼
?
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前對其初始化.!

[C#]  純文本查看 復制代碼
?
1
2
3
private void Rec(SocketHelper.Sockets sks)
         {
         }


這是處理推送器消息的方法.!

SocketHelper.Sockets


大家可以看下這個自定義對象

[C#]  純文本查看 復制代碼
?
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閱讀
上面那些信息絕非無用,而是整個類的重中之重以及消息處理方式.

啟動類庫,並開始監聽

 

[C#]  純文本查看 復制代碼
?
1
2
server.InitSocket(IPAddress.Any, 9527); //監聽所有地址,監聽端口為9527
                 server.Start(); //啟動服務端


之前在窗體加載時已經初始化過變量,現在直接使用它的InitSocket來配置服務端.使用Start方法啟動監聽.!
默認調用后便認為監聽成功.!
如若其他情況,例如異常時: 會推送監聽失敗消息至服務端Rev方法中.具體參閱源碼.

停止服務端


直接調用Stop方法即可停止服務端.Stop方法調用后,可繼續啟動服務端.!
至此,服務端的描述就介紹完了,使用非常簡單,
你要做的就下面幾件事:
                                               1 、 聲明服務端變量。
                                               2 、 初始化推送器。
                                               3 、 配置服務端。
                                               4 、 啟動服務端

服務端發送信息


服務端有兩個自帶方法
                    

[C#]  純文本查看 復制代碼
?
1
server.SendToAll( "服務端消息:[url=http://www.msdn5.com]www.msdn5.com[/url] 隨機消息:" +Guid.NewGuid().ToString());//直接發送字符串


該方法將會對所有連接至服務端的客戶端發送消息.如果在發送中客戶端下線或發生異常,服務端將維護客戶端集合 ClientList
ClientList  會在客戶端接入時添加.如果發生異常等情況會自動刪除

[C#]  純文本查看 復制代碼
?
1
SendToClient(IPEndPoint ip, string SendData);


像單獨某位客戶發起數據.
當客戶端連接時,除去ClientList會自動維護列表外,也會將客戶端推送至UI界面,供大家組合自己想要的客戶端列表.詳細請閱讀demo

客戶端介紹


<ignore_js_op> 
客戶端與服務端一樣,需要先聲明客戶端變量,

[C#]  純文本查看 復制代碼
?
1
SocketHelper.TcpClients client; //聲明客戶端變量 與服務端一樣在窗體加載時初始化.


接着初始化推送器,

[C#]  純文本查看 復制代碼
?
1
SocketHelper.pushSockets = new SocketHelper.PushSockets(Rec); //在窗體加載時初始化推送器


配置客戶端,啟動客戶端.

[AppleScript]  純文本查看 復制代碼
?
1
2
client.InitSocket ( ip , int.Parse ( port ) ) ; / / IP地址支持字符串類型
                client.Start ( ) ;


客戶端發送方法,與服務端一致.調用Send方法.調用Start方法來連接服務器,調用Stop方法斷開連接.支持斷開后重新連接服務端


最后來一張運行時的截圖吧
<ignore_js_op> 

運行截圖.jpg (250.42 KB, 下載次數: 6)

 

 

 



Demo + 類庫下載地址:

 

玄機論壇Socket類庫源碼 當前版本 2.6.3 更新日期:10-09/2015
http://bbs.msdn5.com/thread-27-1-1.html
(出處: C#論壇-玄機論壇-C#論壇-玄機寶盒-玄機類庫-C#)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM