Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说Unity中Socket网络编程「终于解决」,希望能够帮助你!!!。
网络:
7层:应用层 表示层 会话层 传输层 网络层 数据链路层 物理层
网络协议类型:
http https(加密,更安全) ftp Tcp(IP) Udp
http/https:会话完成->断开链接
ftp:本地连接访问
TCP/Udp:会话完成->不断开链接
TCP:双方链接成功,才能进行数据的传输
udp:只管发送数据,不管双方是否链接成功
TCP和udp区别:
1. 面向链接
2. 对系统资源(TCP:更多)
3. 数据处理方式(TCP:流 Udp:包)
4.TCP:处理数据更安全,能保证数据顺序
UDP:处理数据不安全,不能保证数据顺序
服务器:数据处理(登录,注册,商店信息,背包),广播(聊天) 数据存储 心跳(检测是否在线)
TCP链接:3次握手(使用TCP客户端请求链接服务器的过程)
1.客户端给服务器发送一个SYN(序列号)
2.服务器受到客户端请求的SYN后会给存储为Seq,服务器给客户端返回一个回应SYN + ACK
3.客户端收到回复后,再次给服务器发送ACK,来确认链接
TCP断开链接:4次挥手(使用TCP客户端请求断开链接服务器过程)
1.客户端给服务器发送fin,用来请求断开
2.服务器收到fin,回复一个ack
3.服务器再次发送fin给客户端
4.客户端收到了fin,再给服务器发送ack 断开链接
Unity提供网络编程的类Socket
Socket:根据IP和Port(端口号)进行实时监听的操作
**在游戏中我们都是使用Socket的TCP链接方法,和服务器进行数据的交互
客户端使用Socket编程的过程
1.创建Socket对象
2.链接 Connect
3.接受/发送 数据 Receice() / Send
4.关闭链接 Close()
protobuf
using UnityEngine;
using System.Collections;
using ProtoBuf;
using System.IO;
/// <summary>
///
/// </summary>
public class MyInter : MonoBehaviour {
private MemoryStream ms = new MemoryStream ();
void Start()
{
MyPBClass p = new MyPBClass (){name = "liang",age = 3};
SetSer(p);
MyPBClass pb = GetSer ();
Debug.Log (pb.name);
Debug.Log (pb.age);
}
//序列化
private void SetSer(MyPBClass pb)
{
//把pb对象序列化到ms中
ProtoBuf.Serializer.Serialize<MyPBClass> (ms, pb);
ms.Position = 0;
}
//反序列化
private MyPBClass GetSer()
{
MyPBClass pb = ProtoBuf.Serializer.Deserialize<MyPBClass> (ms);
return pb;
}
}
[ProtoContract]
public class MyPBClass
{
[ProtoMember(1)]
public string name;
[ProtoMember(2)]
public int age;
}
网络连接
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.Net;
using System.Net.Sockets;
public class SendMessage : MonoBehaviour {
public Button b;
public InputField contentinputfield;
void Start () {
Button mybutton = b.GetComponent<Button> ();
mybutton.onClick.AddListener (ButtonClick);
InputField inp = contentinputfield.GetComponent<InputField> ();
}
// Update is called once per frame
void Update () {
}
private void ButtonClick()
{
//1.创建Socket
Socket socket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2.链接127.0.0.1指的是本地
string ip = "172.16.11.46";
int port = 1234;//端口号
socket.Connect (ip, port);
//3.发送/接收 数据
string content = contentinputfield.text; System.Text.Encoding.Default.GetBytes("23f");
功能是将字符串转成byte数组
字符串的内容将依次转成byte数组的每一个值
GetBytes是将字符转成ascii码
所以2的ascii就是50
依次类推
byte[] sendBuff = System.Text.Encoding.Default.GetBytes (content);
socket.Send (sendBuff);
00
//服务器要返回数据
//接收
byte[] readBuff = new byte[1024];
int count = socket.Receive (readBuff);
string getStr = System.Text.Encoding.UTF8.GetString (readBuff, 0, count);
Debug.Log ("接收到服务器信息:" + getStr);
//4.关闭
socket.Close ();
}
}
想学习更多网络知识的可以私信哦
上一篇
已是最后文章
下一篇
已是最新文章