基於Tcp協議的Socket通信相似於B/S架構,面向鏈接,但不一樣的是服務器端能夠向客戶端主動推送消息。編程
使用Tcp協議通信須要具有如下幾個條件:數組
(1).創建一個套接字(Socket)服務器
(2).綁定服務器端IP地址及端口號--服務器端架構
(3).利用Listen()方法開啓監聽--服務器端socket
(4).利用Accept()方法嘗試與客戶端創建一個鏈接--服務器端tcp
(5).利用Connect()方法與服務器創建鏈接--客戶端編碼
(6).利用Send()方法向創建鏈接的主機發送消息spa
(7).利用Recive()方法接受來自創建鏈接的主機的消息(可靠鏈接)操作系統
下面用代碼實現簡單的服務器---客戶端通訊,在此實例中兩方只能收發一次消息,若是要進行屢次消息,要使用到線程。線程
服務器端:
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace _021_socket編程_TCP協議 { class Program { static void Main(string[] args) { // 1,建立socket Socket tcpServer = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); //2,綁定ip跟端口號 IPAddress ipaddress = new IPAddress(new byte[]{192,168,1,101}); EndPoint point = new IPEndPoint(ipaddress,7788);//ipendpoint是對ip+端口作了一層封裝的類 tcpServer.Bind(point);//向操做系統申請一個可用的ip跟端口號 用來作通訊 //3,開始監聽 (等待客戶端鏈接) tcpServer.Listen(100);//參數是最大鏈接數 Console.WriteLine("開始監聽"); Socket clientSocket = tcpServer.Accept();//暫停當前線程,直到有一個客戶端鏈接過來,以後進行下面的代碼 Console.WriteLine("一個客戶端鏈接過來了"); //使用返回的socket跟客戶端作通訊 string message = "hello 歡迎你"; byte[] data = Encoding.UTF8.GetBytes(message);//對字符串作編碼,獲得一個字符串的字節數組 clientSocket.Send(data); Console.WriteLine("向客戶端發送了一條數據"); byte[] data2 = new byte[1024];//建立一個字節數組用來當作容器,去承接客戶端發送過來的數據 int length = clientSocket.Receive(data2); string message2 = Encoding.UTF8.GetString(data2, 0, length);//把字節數據轉化成 一個字符串 Console.WriteLine("接收到了一個從客戶端發送過來的消息:"+message2); Console.ReadKey(); } } }
客戶端:
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace _001_socket編程_tcp協議_客戶端 { class Program { static void Main(string[] args) { //1,建立socket Socket tcpClient = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); //2,發起創建鏈接的請求 IPAddress ipaddress = IPAddress.Parse("192.168.1.101");//能夠把一個字符串的ip地址轉化成一個ipaddress的對象 EndPoint point = new IPEndPoint(ipaddress,7788); tcpClient.Connect(point);//經過ip:端口號 定位一個要鏈接到的服務器端 byte[] data = new byte[1024]; int length = tcpClient.Receive(data);//這裏傳遞一個byte數組,實際上這個data數組用來接收數據 //length返回值表示接收了多少字節的數據 string message = Encoding.UTF8.GetString(data,0,length);//只把接收到的數據作一個轉化 Console.WriteLine(message); //向服務器端發送消息 string message2 = Console.ReadLine();//讀取用戶的輸入 把輸入發送到服務器端 tcpClient.Send( Encoding.UTF8.GetBytes(message2) );//把字符串轉化成字節數組,而後發送到服務器端 Console.ReadKey(); } } }
執行過程:
(1)首先開啓服務器
(2)而後開啓客戶端,此時,客戶端鏈接到服務器,收到服務器發來的消息
(3)在客戶端輸入一條消息發給服務器