C#編程 socket編程之tcp服務器端和客戶端

基於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)在客戶端輸入一條消息發給服務器

相關文章
相關標籤/搜索