C#程式設計 socket程式設計之tcp伺服器端和客戶端
阿新 • • 發佈:2018-12-16
基於Tcp協議的Socket通訊類似於B/S架構,面向連線,但不同的是伺服器端可以向客戶端主動推送訊息。
使用Tcp協議通訊需要具備以下幾個條件:
(1).建立一個套接字(Socket)
(2).繫結伺服器端IP地址及埠號--伺服器端
(3).利用Listen()方法開啟監聽--伺服器端
(4).利用Accept()方法嘗試與客戶端建立一個連線--伺服器端
(5).利用Connect()方法與伺服器建立連線--客戶端
(6).利用Send()方法向建立連線的主機發送訊息
(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)在客戶端輸入一條訊息發給伺服器