Socket通訊的Demo
阿新 • • 發佈:2018-12-27
Demo
不講細節了,直接上程式碼, 如果要實現比較複雜的socket功能,最好不要像下面自己寫,使用fastsocket等框架。
Socket服務埠的程式碼:
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApp1 { class Program { static void Main(string[] args) { //點選開始監聽時 在服務端建立一個負責監聽IP和埠號的Socket Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ip = IPAddress.Parse("127.0.0.1") ; //建立物件埠 IPEndPoint point = new IPEndPoint(ip, 8087); socketWatch.Bind(point);//繫結埠號 Console.WriteLine("listen success!"); socketWatch.Listen(10);//設定監聽 //建立監聽執行緒 Thread thread = new Thread(Listen); thread.IsBackground = true; thread.Start(socketWatch); while (true) { Console.WriteLine("please send information to client:"); Send(Console.ReadLine()); } //Console.ReadLine(); } static Socket socketSend; static void Listen(object o) { try { Socket socketWatch = o as Socket; while (true) { socketSend = socketWatch.Accept();//等待接收客戶端連線 Console.WriteLine(socketSend.RemoteEndPoint.ToString() + ":" + "connect success!"); //開啟一個新執行緒,執行接收訊息方法 Thread r_thread = new Thread(Received); r_thread.IsBackground = true; r_thread.Start(socketSend); } } catch { } } static void Received(object o) { try { Socket socketSend = o as Socket; while (true) { //客戶端連線伺服器成功後,伺服器接收客戶端傳送的訊息 byte[] buffer = new byte[1024 * 10]; //實際接收到的有效位元組數 int len = socketSend.Receive(buffer); if (len == 0) { break; } string str = Encoding.UTF8.GetString(buffer, 0, len); Console.WriteLine(socketSend.RemoteEndPoint + ":" + str); } } catch { } } static void Send(string str) { byte[] buffer = Encoding.UTF8.GetBytes(str); socketSend.Send(buffer); } } }
Socket客戶端的程式碼:
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApp2 { class Program { static Socket socketSend; static void Main(string[] args) { //建立客戶端Socket,獲得遠端ip和埠號 socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ip = IPAddress.Parse("127.0.0.1"); IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32("8087")); socketSend.Connect(point); Console.WriteLine("connect success!"); //開啟新的執行緒,不停的接收伺服器發來的訊息 Thread c_thread = new Thread(Received); c_thread.IsBackground = true; c_thread.Start(); Console.WriteLine("please send information to server:"); string msg = Console.ReadLine(); byte[] buffer = new byte[1024 * 1024 * 3]; buffer = Encoding.UTF8.GetBytes(msg); socketSend.Send(buffer); Console.ReadLine(); } static void Received() { while (true) { try { byte[] buffer = new byte[1024 * 1024 * 3]; //實際接收到的有效位元組數 int len = socketSend.Receive(buffer); if (len == 0) { break; } string str = Encoding.UTF8.GetString(buffer, 0, len); Console.WriteLine(socketSend.RemoteEndPoint + ":" + str); } catch { } } } } }
如果想更牛X的話,可以寫成非同步。
參考文件
https://www.cnblogs.com/wangkaining/p/6089627.html
下面兩篇可以看socket原理
https://www.cnblogs.com/ysyn/p/3399351.html
http://www.cnblogs.com/dotnet261010/p/6211900.html