using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace 理解Scoket協議
{
class 同步套接字
{
static void Main(string[] args)
{
///使用同步套接字技術實現網絡通信有5個方面:主機解析、主機綁定、端口監聽、數據接收和數據發送
}
public void 定義主機對象()
{
//①定義主機對象(有兩種方法)
//第一種使用IPEndPoint方法定義主機對象
IPEndPoint myServer1 = new IPEndPoint(12345, 80);
//第二種使用IPAddress類,其作用是把字符串轉換為IP地址的格式
IPAddress myIP = IPAddress.Parse("127.0.0.1");
IPEndPoint myServer2 = new IPEndPoint(myIP, 8080);
}
public void 主機解析()
{
//②主機解析(在綁定主機之前,要先使用DNS服務器解析主機)
//下面的代碼是使用Dns類的GetHostEntry()方法解析遠程的google主機
IPHostEntry myHost = new IPHostEntry();
myHost = Dns.GetHostEntry("www.2cto.com");
//然後使用IPHostEntry對象的AddressList()方法,可以獲得與主機關聯的IP地址列表,獲取IP地址列表的代碼如下:
for (int i = 0; i < myHost.AddressList.Length; i++)
{
myHost.AddressList[i].ToString();
}
//使用IPHostEntry對象的HostName()方法還可以獲取主機的DNS名稱
}
public void 端口綁定和監聽()
{
//③端口綁定和監聽都使用Socket類,其方法Bind()表示綁定通信主機,方法Listen()表示監聽。
//下面的代碼是使用Dns類的GetHostEntry()方法解析遠程的google主機
IPAddress myIP = IPAddress.Parse("127.0.0.1");
IPEndPoint myServer = new IPEndPoint(myIP, 8080);
//創建Socket對象
Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//綁定主機
socket.Bind(myServer);
//偵聽
socket.Listen(123);
}
public void 數據發送()
{
//④在綁定主機端口和監聽之後,必須要使用Socket類的Accept()方法,接收客戶端的連接請求;
//這樣,客戶端和服務器端就建立了連接,數據發送使用Socket類的Send()方法。代碼如下:
IPAddress myIP = IPAddress.Parse("127.0.0.1");
IPEndPoint myServer = new IPEndPoint(myIP, 8080);
//創建Socket對象
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//綁定主機
socket.Bind(myServer);
//偵聽
socket.Listen(123);
Socket mySend = socket.Accept();
//定義發送的消息
Byte[] myByte=new Byte[64];
string message = "發送一個消息!";
myByte = System.Text.Encoding.BigEndianUnicode.GetBytes(message.ToCharArray());
//發送
mySend.Send(myByte,myByte.Length,0);
}
public void 數據接收()
{
//⑤數據接收可以使用Socket類的Receive()方法。代碼如下:
IPAddress myIP = IPAddress.Parse("127.0.0.1");
IPEndPoint myServer = new IPEndPoint(myIP, 8080);
//創建Socket對象
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//綁定主機
socket.Bind(myServer);
//偵聽
socket.Listen(123);
Socket mySend = socket.Accept();
//定義接收格式
Byte[] myByte=new Byte[64];
//接收
mySend.Receive(myByte,myByte.Length,0);
//格式轉換
string msg = System.Text.Encoding.BigEndianUnicode.GetString(myByte);
}
}
class 異步套接字
{
///異步套接字與同步套接字一樣,也有5個方面:主機解析、主機綁定、端口監聽、數據接收和數據發送。
///其中,主機解析、主機綁定和端口監聽是相同的,所以這裡就不再詳細講述。下面重點講解數據接收和數據發送。
public void 數據發送()
{
///與同步套接字不同的是,異步套接字使用的是Socket類的BeginSend()方法。這個方法有六個參數。
///第一個參數是字節數組
///第二個參數是開始發送的位置
///第三個參數是發送的字節數
///第四個參數是SocketFlags值的按位組合
///第五個參數是異步回調
///第六個參數是自定義對象
}
public void 數據接收()
{
///與同步套接字不同的是,異步套接字使用的是Socket類的BeginReceive()方法。這個方法有六個參數。
///第一個參數是字節數組
///第二個參數是開始發送的位置
///第三個參數是發送的字節數
///第四個參數是SocketFlags值的按位組合
///第五個參數是異步回調
///第六個參數是自定義對象
}
}
}
作者:bugDemo