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

套接字Socket

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

参考:http://www.voidcn.com/article/p-thmlwjza-bkr.html


1.Socket连接的流程


步骤

①开启一个连接之前,首先要完成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

发送数据。

每日一句
    每一个你不满意的现在,都有一个你没有努力的曾经。