C# SOCKET發送和接收例子
Socket 客戶端using System; using System.Collections.Generic; using System.Linq; using System.Text;
using System.Net; using System.Net.Sockets;
namespace A0140_SocketClient.Sample {
/// <summary> /// 這個類為一個 Socket 客戶端的例子. /// 這個類簡單的 連接到 Socket 服務器,并發送一段消息。 /// 然后讀取來自服務器的反饋 /// 最后結束程序. /// /// 服務端輸出: /// 開始偵聽 8088 端口…… /// 接收到客戶的連接 /// 接收到來自客戶端的數據為:Hello Socket Server! /// /// 客戶端輸出: /// 向服務器發送到了:Hello Socket Server! /// 從服務器接收到了:Hello Socket Server! /// /// </summary> class StockClient { /// <summary> /// 字符編碼處理. /// </summary> private static readonly Encoding ASCII; /// <summary> /// 用于 發送/接收的端口. /// </summary> private const int PORT = 8088; private const String SEND_MESSAGE = "Hello Socket Server!"; static StockClient() { ASCII = Encoding.ASCII; } public void SendMessage() { // 構造用于發送的 字節緩沖. Byte[] sendBytes = ASCII.GetBytes(SEND_MESSAGE); // 構造用于接收的 字節緩沖. Byte[] recvBytes = new Byte[256]; // IP地址. IPAddress localAddr = IPAddress.Parse("127.0.0.1"); // 接入點. IPEndPoint ephost = new IPEndPoint(localAddr, PORT); // 第一個參數:AddressFamily = 指定 Socket 類的實例可以使用的尋址方案。 // Unspecified 未指定地址族。 // InterNetwork IP 版本 4 的地址。 // InterNetworkV6 IP 版本 6 的地址。 // // 第二個參數:SocketType = 指定 Socket 類的實例表示的套接字類型。 // Stream 一個套接字類型,支持可靠、雙向、基于連接的字節流,而不重復數據,也不保留邊界。 // 此類型的 Socket 與單個對方主機通信,并且在通信開始之前需要建立遠程主機連接。 // 此套接字類型使用傳輸控制協議 (Tcp),AddressFamily 可以是 InterNetwork,也可以是 InterNetworkV6。 // // 第三個參數:ProtocolType = 指定 Socket 類支持的協議。 // Tcp 傳輸控制協議 (TCP)。 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { // 嘗試連接主機. s.Connect(ephost); Console.WriteLine("向服務器發送到了:{0}", SEND_MESSAGE); // 向主機發送數據. s.Send(sendBytes, sendBytes.Length, SocketFlags.None); // 接收服務器的應答. Int32 bytes = s.Receive(recvBytes, recvBytes.Length, SocketFlags.None); StringBuilder buff = new StringBuilder(); while (bytes > 0) { // 將緩沖的字節數組,裝換為字符串. String str = ASCII.GetString(recvBytes, 0, bytes); // 加入字符串緩存 buff.Append(str); // 再次接受,看看后面還有沒有數據. bytes = s.Receive(recvBytes, recvBytes.Length, SocketFlags.None); } Console.WriteLine("從服務器接收到了:{0}", buff.ToString()); } catch (Exception ex) { Console.WriteLine("連接/發送/接收過程中,發生了錯誤!"); Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } finally { s.Close(); } } }}
Socket 服務端
?using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Collections.Generic; using System.Linq; using System.Text;
using System.Threading;
namespace A0130_SocketServer.Sample {
/// <summary> /// Socket 服務端例子 /// /// 這個例子僅僅處理一個 客戶端的訪問, 處理完畢后退出. /// /// /// 服務端的輸出為: /// /// 開始偵聽 8088 端口…… /// 接收到客戶的連接 /// 接收到來自客戶端的數據為:1 /// /// /// /// 客戶端的輸入為: /// /// telnet 127.0.0.1 8088 /// 1 /// 失去了跟主機的連接。 /// /// /// </summary> class SocketServer { /// <summary> /// 字符編碼處理. /// </summary> private static readonly Encoding ASCII; /// <summary> /// 用于 監聽的端口. /// </summary> private const int PORT = 8088; static SocketServer() { ASCII = Encoding.ASCII; } public void StartServer() { TcpListener myListener = null; try { // IP地址. IPAddress localAddr = IPAddress.Parse("127.0.0.1"); // 在 8088 端口 開一個偵聽. myListener = new TcpListener(localAddr, PORT); // 開始偵聽. myListener.Start(); Console.WriteLine("開始偵聽 {0} 端口……", PORT); // 程序在這里暫停, 等待客戶端的接入. Socket mySocket = myListener.AcceptSocket(); // 如果執行到這里,說明接收到了客戶的連接. Console.WriteLine("接收到客戶的連接"); // 字節緩沖. Byte[] recvBytes = new Byte[256]; // 讀取數據到緩沖區當中 Int32 bytes = mySocket.Receive(recvBytes, recvBytes.Length, SocketFlags.None); // 將緩沖區當中的 byte 數組,轉化為 字符串. String str = ASCII.GetString(recvBytes, 0, bytes); Console.WriteLine("接收到來自客戶端的數據為:{0}", str); // 將讀取到的數據,發送回給客戶端. mySocket.Send(recvBytes, bytes, SocketFlags.None); // 休眠5秒. Thread.Sleep(5000); // 關閉 Socket mySocket.Close(); } catch (SocketException e) { Console.WriteLine("SocketException: {0}", e); } finally { myListener.Stop(); } } }}
</pre>
本文由用戶 xmnx 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!