Unity3D遊戲製作學習記錄01——叢林戰爭
Siki學院的視頻教程指路牌:http://www.sikiedu.com/course/61.
學業繁忙…和朋友一起跟着siki的叢林戰爭的教程跟着做來交作業,僅用於學習筆記記錄,最終的成品效果也不知道,翻不翻車我們拭目以待(●ˇ∀ˇ●)
TCP/IP介紹
在網絡通信中,路由器是起到一箇中轉站的作用,發送的目的主機就是靠路由器識別IP轉發,IP就是目的主機的地址。
IP粗略分類:
局域網IP:是可以通過ipconfig查詢到的,是在連接同一個路由的主機構成的一個局域網內,由路由分配的IP。在這個局域網內,IP唯一且不可重複。(本地座標系)
公網IP:不可以在本地查詢,它是該局域網內的主機對於外界的位置標識,是同一局域網內主機共享的IP。可以通過百度查找得到。(世界座標系)
端口號
由於IP可以定位到主機,主機上不同的要通信的程序佔用着不同的端口,因此要到軟件的話,需要IP+端口來定位。
一、服務器端——簡單收發
① 工程創建
VS2019 項目類型:C# .Net Framework 控制檯應用
創建服務器項目:TCPServer
② 代碼編寫
實現步驟
- 創建套接字,一般是指定套接字綁定ip的類型(IPv4/IPv6),套接字通信的類型,套接字所使用的協議;
- 爲套接字綁定IP;由於現在的主機一般都是配置了兩個網卡,有的甚至更多,我們要讓這個套接字知道是監聽哪一個ip的通信消息,所以要爲套接字綁定IP。
關於IP:我們除了ipconfig 查看到對應IP,也可以填寫“127.0.0.1”,這個IP是默認當前主機的IP,如果實在不清楚,就可以直接寫這個。
IPaddress: 就是IP地址,即127.0.0.1
IPEndPoint: IP:Port,IP地址加上端口號127.0.0.1:xxxxxx - 把套接字開啓監聽,監聽方法的參數是int類型的,它表示的是處理客戶端請求的數量,即可以處理的等待隊列的長度,但不表示可以容納服務器的最大連接數,參數爲0時表示無限制。
class Program
{
static void Main(string[] args)
{
//用於通信的套接字: IP類型,套接字類型:管道通信, 協議:TCP
Socket serverScoket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);
// 定義IP
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
int port = 7788;
IPEndPoint iPEndPoint = new IPEndPoint(ipAddress, port);
// 綁定IP
serverScoket.Bind(iPEndPoint);
// 開啓監聽
serverScoket.Listen(0);
}
}
- 監聽開啓後,要接收所收到的連接請求,接收連接的方法Accept()執行過程中會一直等待,直到有連接了纔會執行Accept()下面的代碼。而Accept()會返回一個Socket類型的變量,是關於監聽到的客戶端套接字的連接。
- 嘗試向客戶端發送一條消息,並簡單接收一下客戶端發來的消息。
關於接收客戶端的消息,由於我們不肯定接收的消息的長度,因此Receive()方法會有一個int返回值,是返回的消息的字符數。在轉換爲字符串的時候,我們需要指明是從第幾個位置開始讀,讀多長的消息內容。 - 因爲僅用於測試,因此我們在上述一些操作之後,我們把和客戶端的連接關閉掉,服務器也關閉掉。
要注意的是:客戶端是否關閉,服務器並不能控制,這裏僅僅是把連接關閉。
// 等待連接,直到接收到連接請求
Socket clientSocket = serverScoket.Accept();
// 向客戶端發送一條消息(二進制)
string msgSend = "連接成功,服務器向客戶端發送消息...";
byte[] msgByt = System.Text.Encoding.UTF8.GetBytes(msgSend);
clientSocket.Send(msgByt);
// 定義緩存區,接收客戶端發來的消息
byte[] readBuf = new byte[1024];
int count = clientSocket.Receive(readBuf);
string msgRecv = System.Text.Encoding.UTF8.GetString(readBuf, 0, count);
Console.WriteLine(msgRecv);
Console.ReadKey();
// 關閉連接
clientSocket.Close();
serverScoket.Close();
二、客戶端——簡單收發
在原來的解決方案上,右鍵添加新項目:TCPClient
具體代碼
客戶端發送消息,由用戶自定義輸入用於檢測,並在連接斷開前,都補充了Console.ReadKey();用於觀察結果。
static void Main(string[] args)
{
//用於通信的套接字: IP類型,套接字類型:管道通信, 協議:TCP
Socket socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 服務器請求連接客戶端
socketClient.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7788));
// 客戶端接收消息
// 定義緩存區,存儲接收到的服務器消息
byte[] readBuf = new byte[1024];
int count = socketClient.Receive(readBuf);
string msgRecv = System.Text.Encoding.UTF8.GetString(readBuf, 0, count);
// 將消息顯示在控制檯上
Console.WriteLine(msgRecv);
// 客戶端向服務器發送消息,發送的消息由用戶在控制檯輸入
string msgSend = Console.ReadLine();
socketClient.Send(System.Text.Encoding.UTF8.GetBytes(msgSend));
Console.ReadKey();
// 關閉連接
socketClient.Close();
}
運行結果
- 首先運行服務器
- 運行客戶端,接收到和客戶端發送的消息
- 客戶端編輯自定義消息
- 服務器端消息接收