Unity游戏开发网络基础(2)

时间:2022-09-14 11:18:36

套接字Socket

在网络游戏制作中,套接字是支持TCP/IP协议网络通信的基本操作单位,可以将套接字看做不同主机间的进程双向通信的端点,它构成单个主机内及整个网络间的编程界面。

参考:http://blog.csdn.net/cxh342968816/article/details/6336914


1.Socket连接的流程

Unity游戏开发网络基础(2)

步骤

①开启一个连接之前,首先要完成Socket和Bind两个步骤。新建一个Socket,Bind指定套接字IP和端口。

②服务端通过Listen开启监听,等待客户端接入。

③客户端利用Connect连接服务器,服务端通过Accept接受客户端连接。

④客户端和服务端通过write和read发送和接受数据。

⑤通过close关闭。


2.Socket类一些方法和属性

System.Net.Sockets命名空间

这里可查询:https://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket(VS.80).aspx


3.一个简单的小梨子(同步Socket程序)

服务端

using System;
using System.Net;
using System.Net.Sockets;

/*服务端程序*/
class MainClass
{
public static void Main(string []args)
{
/*第一步,创建Socket*/
Socket listenfd = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.TCP);

/*第二步,绑定IP和端口*/
IPAddress ipaddress = IPAddress.Parse("127.0.0.1");/*本地地址*/
int port = 6666;/*程序端口号*/
IPEndPoint ipEndPoint new IPEndPoint(ipaddress,port);
listenfd.Bind(ipEndPoint);

/*第三步,监听*/
listenfd.Listen(0);/*不限制最大连接数目*/
Console.WriteLine("服务器启动成功");

while(true)
{
/*第四步,客户端连接*/
Socket connectfd = listenfd.Accept();/*连接服务器的客户端Socket*/
Console.WriteLine("客户端已连接");

/*第五步,接受数据*/
/*容器(用于存放数据)*/
byte[] readBuff = new byte[1024];
/*接受客户端数据,保存到容器中并返回数据长度*/
int count = connectfd.Receive(readBuff);
/*将接受到的数据转换成string类型*/
string str = System.Text.Encoding.UTF8.GetString(readBuff,0,count);
Console.WriteLine("服务器接收数据" + str);

/*第六步,发送数据*/
byte[] writeBuff = System.Text.Encoding.Default.GetByte(str + "我已经接收到了");
connectfd.Send(writeBuff);/*将接收到的数据加上信息发送给客户端*/
}
}
}

客户端程序

using UnityEngine;
using System.Collections;
using System.Net;
using Ststem.Net.Socket;

public class Client : MonoBehaviour
{
/*第一步,创建Socket*/
Socket socket;

/*第二步,确定目标服务器的IP地址和端口(可以用任何方法获取)*/
private string ipaddress = "127.0.0.1";/*IP地址*/
private int port = 7777;/*端口*/

void Start()
{
socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.TCP);

/*第三步,连接*/
socket.Connect(ipaddress,port);
Debug.Log("客户端地址:" + socket.LocalEndPoint.ToString());

/*第四步,发送数据*/
string str = "Hello,Unity";
byte[] bytes = Ststem.Text.Encoding.Default.GetByte(str);
socket.Send(bytes);

/*第五步,接收数据*/
private const int BUFFER_SIZE = 1024;
byte[] readBuff = new byte[BUFFER_SIZE];/*文件接受缓冲区*/
int count = socket.Receive(readBuff);
str = System.Text.Encoding.UTF8.GetString(readBuff,0,count);
Debug.Log(str);/*服务器回应的数据*/

/*第六步,关闭连接*/
socket.Close();
}
}

先开启服务端,再开启客户端,这样就能实现功能了。


相关要点:

①Socket构造函数的参数分别表示

△(AddressFamily)地址族:IPv4或IPv6,IPv4即InterNetwork

△(SocketType)套接字类型:http://www.cnblogs.com/istrong/archive/2012/06/10/2544357.html 有详细说明,游戏常用Stream。

△(ProtocolType)协议:https://msdn.microsoft.com/zh-cn/library/system.net.sockets.protocoltype.aspx

②Bind

给创建的listenfd套接字绑定IP和端口。

③Listen

开启监听,等待客户端连接。参数指定队列中最多可以容纳等待接受的连接数,0表示不限制。

④Accept(阻塞方法,就是客户端没有连接的时候在这里等待)

接受客户端连接,返回一个新的客户端Socket。

⑤Receive(阻塞方法)

接受数据

△参数:byte数组,存储接收到的数据。

△返回值:所接收数据的长度。

⑥Send

发送数据。