SOCKET網(wǎng)絡(luò)編程
SOCKET
Socket相當(dāng)于手機(jī),代表通訊方式,客戶端要連接服務(wù)器端,那么要撥打電話,那么這個(gè)IP地址以及每個(gè)應(yīng)用程序的端口號(hào)構(gòu)成了電話號(hào)碼,服務(wù)器端至少兩個(gè)Socket,一個(gè)負(fù)責(zé)監(jiān)聽(tīng)是否有人打電話進(jìn)來(lái),另一個(gè)是當(dāng)監(jiān)聽(tīng)到有人打進(jìn)來(lái)的時(shí)候,創(chuàng)建的一個(gè)新的通訊給他們連接,其實(shí)就是總座機(jī)跟分機(jī)的區(qū)別
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace SOCKET網(wǎng)絡(luò)編程 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnWatch_Click(object sender, EventArgs e) { //創(chuàng)建一個(gè)負(fù)責(zé)監(jiān)聽(tīng)的Socket Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //創(chuàng)建IP地址和端口號(hào)對(duì)象 IPAddress ip = IPAddress.Any;//這句Any是獲取自己當(dāng)前本機(jī)的IP, //IPAddress ip=IPAdress.Parse(txtIP.Text); 這句是獲取textbox里面輸入的地址 IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));//這里是獲取文本框里輸入的端口號(hào),創(chuàng)建了一個(gè)端口對(duì)象,需要傳入ip跟端口號(hào) //讓負(fù)責(zé)監(jiān)聽(tīng)的Socket綁定IP地址跟端口號(hào) socketWatch.Bind(point); ShowMsg("監(jiān)聽(tīng)成功"); //設(shè)置監(jiān)聽(tīng)隊(duì)列 socketWatch.Listen(10); Thread th = new Thread(listen); th.IsBackground = true; th.Start(socketWatch); } void listen(object o) { Socket socketWatch = o as Socket;//as的用法就是如果可以的話,那就直接轉(zhuǎn)換過(guò)去 while (true) { //負(fù)責(zé)監(jiān)聽(tīng)的Socket 來(lái)接收客戶端的連接 創(chuàng)建跟客戶端通信的Socket Socket socketSend = socketWatch.Accept(); //如果接收成功,把發(fā)送端的地址顯示出來(lái) ShowMsg(socketSend.RemoteEndPoint.ToString() + "連接成功"); } } void ShowMsg(string str) { txtShow.AppendText(str + "\r\n"); } private void Form1_Load(object sender, EventArgs e) { Control.CheckForIllegalCrossThreadCalls = false; } } }

一般應(yīng)用模式(服務(wù)器端和客戶端)
服務(wù)器端的Socket(至少需要兩個(gè))
1)一個(gè)負(fù)責(zé)接收客戶端的連接請(qǐng)求(但不負(fù)責(zé)與客戶端通信)
2)每成功連接到一個(gè)客戶端的連接,便在服務(wù)端產(chǎn)生一個(gè)對(duì)應(yīng)的負(fù)責(zé)通信的Socket
在接收到客戶端連接時(shí)創(chuàng)建
為每個(gè)連接成功的客戶端請(qǐng)求在服務(wù)器端都創(chuàng)建一個(gè)對(duì)應(yīng)的Socket(負(fù)責(zé)和客戶端通信)
客戶端的Socket
客戶端的Socket
1)必須指定要連接的服務(wù)器端地址和端口
2)通過(guò)創(chuàng)建一個(gè)Socket對(duì)象來(lái)初始化一個(gè)到服務(wù)器端的TCP連接
一般我們使用的Socket有兩種類型
流式Socket(STREAM):是一種面向連接的Socket,針對(duì)于面向連接的TCP服務(wù)應(yīng)用,安全但是效率低;
數(shù)據(jù)報(bào)式Socket(DATARAM):是一種無(wú)連接的Socket,對(duì)應(yīng)于無(wú)連接的UDP服務(wù)應(yīng)用,不安全(丟失,順序混亂,在接收端要分析重排及要求重發(fā)),但是效率高。

浙公網(wǎng)安備 33010602011771號(hào)