首先看網絡通信的前提:
網絡通信還是要基於協議的規范,從一個通信軟件到另一個通信軟件,要從應用層、傳輸層、網絡層、物理層。IIS服務器上運用到了應用層上http協議,傳輸層上的tcp協議。聊天軟件上以QQ和FQ為代表類型,QQ是一種廣域網的聊天軟件,它是一種基於面象連接的TCP協議,FQ(飛秋)局域網聊天軟件應用到了基於非連接的UDP(登陸廣播)和TCP(消息單播文件單傳)。
網絡連接的宗旨無非要resqust(請求)和response(響應)。連接到哪兒,誰接收?那就要靠IP地址來找到對應的主機(host),發送或請求通信的軟件在哪里?那就要看我們的端口來找到它了。
在傳輸層,遵循那種規范?ipv4,ipv6,傳輸方式,面象連接TCP還是非連接UDP。
好了,現在不多說了,那就做個簡單的類似QQ聊天軟件來理解socket內部原理吧。
QQ聊天軟件是一個面象連接的軟件,它有一個服務器中轉站,我們都是用它的客戶端。客戶端發送消息到服務器,服務器記錄下聊天記錄並轉發給另一個客戶端。
首先來理一個思路:
第一步,先實現客戶給服務器發消息:
1、創建一個服務端 Server
1.1、在服務器上用一個socket綁定一個端點IPEndPoint(它包含ip地址和商品號)。
1.2、用這個socket在服務器端不斷的監聽來自客戶端的請求,如果接到一個請求就創建一個負責通信的socket 。
1.3、用這個連接的socket收發消息。
2、客戶端 Client
2.1、在客戶端用一個socket負責和服務器端握手並建立連接連接。
來寫代碼吧:
//構建一個負責監聽的socket,它有三個枚舉類型的參數,分別定義了連接方式、傳輸流、傳輸協議,我這里是(ipv4,字節流,面象連接) Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ip = IPAddress.Parse(txtServer.Text); IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text)); //把一個IP地址和對應的商品綁定到一個socket,監聽…… socket.Bind(point); //這里的Listen方法來開始監聽,一個規定只能處理一個請求的隊列 socket.Listen(10); ShowMsg("開始監聽");
//由於服務器端要不斷的要接收來自客戶端請求( socket.Accept()),所以要創建一個線程來執行它 Thread th = new Thread(ResMsg); th.IsBackground = true; //start方法只能傳一個object th.Start(socket); //這個方法ResMsg //監聽用戶 void ResMsg(object o) { //由於要接收多個用戶的請求,每來一個用戶就創建一個負責連接的socket while (true) { Socket socket = o as Socket; Socket consocket = socket.Accept(); string conneip = consocket.RemoteEndPoint.ToString(); ShowMsg("\r\n" + conneip + "連接成功"); } }
客戶端
Thread th; Socket socket; private void List_Load(object sender, EventArgs e) { //創建連接的socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //指定服務器的ip和端口號 IPAddress ip = IPAddress.Parse("192.168.1.102"); IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(50000)); //連接 socket.Connect(point); }
好了,現在客戶端就可以連上服務器了,好了,今天就寫到這里了,准備睡覺了,明天繼續……