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();
}
运行结果
- 首先运行服务器
- 运行客户端,接收到和客户端发送的消息
- 客户端编辑自定义消息
- 服务器端消息接收