Unity使用Socket与后台连接,包含Json的读写
来源:互联网 发布:python java薪资 编辑:程序博客网 时间:2024/05/23 17:28
在做游戏开发,最近正在将前端与后台连接,就写一下笔记记录一下吧!
我用的是Socket与后台进行连接,数据的传输用的是Json格式。也是从零做起的,以前没有与服务器连接的经验,所以也是结合了网上一些资料。首先说一下总体思路吧,这里没有用异步,采用的是新建了线程,来接收数据,并存到队列进行调用解析。
Socket的建立和链接:
using UnityEngine;using System.Collections.Generic;using System.Collections;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;public class TcpClientHandler:MonoBehaviour{Socket serverSocket; //服务器端socketprivate string ClientIP = "192.168.1.139";//IP地址,改成自己的IPAddress ip; //主机ipIPEndPoint ipEnd;string recvStr; //接收的字符串string sendStr; //发送的字符串byte[] recvData=new byte[1024]; //接收的数据,必须为字节byte[] sendData=new byte[1024]; //发送的数据,必须为字节int recvLen = 0; //接收的数据长度Thread connectThread; //连接线程private Queue<string> queue = new Queue<string> ();//新建一个队列,用来存储服务器发来的数据//服务器初始化public void InitSocket(){ip=IPAddress.Parse(ClientIP);ipEnd=new IPEndPoint(ip,8009); //服务器端口号,自己改//开启一个线程连接connectThread=new Thread(new ThreadStart(SocketReceive));connectThread.Start();}//接收服务器消息void SocketConnet(){if(serverSocket!=null)serverSocket.Close();//定义套接字类型,必须在子线程中定义serverSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//连接serverSocket.Connect(ipEnd);recvLen=serverSocket.Receive(recvData);recvStr=Encoding.UTF8.GetString(recvData,0,recvLen);print(recvStr);queue.Enqueue (recvStr);}public void SocketSend(string sendStr){//清空发送缓存sendData=new byte[1024];//数据类型转换sendData=Encoding.UTF8.GetBytes(sendStr);//发送serverSocket.Send(sendData,sendData.Length,SocketFlags.None);}void SocketReceive(){SocketConnet();//不断接收服务器发来的数据while(true){recvData=new byte[1024];recvLen=serverSocket.Receive(recvData);if(recvLen==0){SocketConnet();continue;}recvStr=Encoding.UTF8.GetString(recvData,0,recvLen);queue.Enqueue (recvStr);print(recvStr);}}//返回接收到的字符串public string GetRecvStr(){string returnStr;//加锁防止字符串被改lock(this){if (queue.Count > 0) {//队列内有数据时,取出returnStr = queue.Dequeue ();return returnStr;}} return null;}public void SocketQuit(){//关闭线程if(connectThread!=null){connectThread.Interrupt();connectThread.Abort();}//最后关闭服务器if(serverSocket!=null)serverSocket.Close();}}
然后在另一个脚本启动服务器:
using UnityEngine;using System.Collections;using LitJson;using UnityEngine.SceneManagement;public class TcpTest:MonoBehaviour{public static TcpTest _instance;TcpClientHandler tcpClient;JsonData returnDataJson;void Awake(){DontDestroyOnLoad (this.gameObject);}// Use this for initializationvoid Start(){//初始化网络连接//tcpClient=new TcpClientHandler(); tcpClient=gameObject.AddComponent<TcpClientHandler>();tcpClient.InitSocket();}// Update is called once per framevoid Update(){returnDataHandle ();}//服务器返回消息的处理void returnDataHandle(){returnData = tcpClient.GetRecvStr ();//print (returnData);if (returnData != null){returnDataJson = JsonMapper.ToObject (returnData);switch(returnDataJson["cmd"].ToString()){//在此处解析Json,如有项目需要,最好在其他脚本编写,此处只为方便}}}void OnApplicationQuit(){//退出时关闭连接tcpClient.SocketQuit();print ("Quit");}public void closeC(){//此处比较关键,因为在我们调试时,关闭程序Unity并不一定认为你是退出,所以上面代码也许不会执行,导致与服务器一直连接,Unity崩溃tcpClient.SocketQuit();print ("closeC");}}
最后说一下Json的处理,首先要导入LitJson库,然后在脚本中using LitJson。
发送数据举例:
//注册public void RegisterEvent(string username, string password){JsonData registerJson = new JsonData ();registerJson ["cmd"] = "Login|register";registerJson ["name"] = "wyq";registerJson ["tel"] = username;registerJson ["psd"] = password;string registrStr = registerJson.ToJson();tcpClient.SocketSend (registrStr);}
接收的处理上面代码中已有部分介绍,在获取json数据后,进行解析调用即可。
2 0
- Unity使用Socket与后台连接,包含Json的读写
- unity使用Socket与HTTP连接服务器传输数据包
- flex通过socket json与后台通讯
- 关于 unity如何读写Json的学习
- 使用unity 5.3版本以上 自带Json解析器与后台进行登录验证。
- [Unity&JSON]读写JSON父类的成员
- Android客户端与服务器端通过SOCKET连接进行读写(将JSON数据转化为字符串后传输)
- unity深入研究--开发之C#使用Socket与HTTP连接服务器传输数据包
- [Unity](笔记)使用litJson读写Json数据
- python3 json数据包含中文的读写问题
- [Unity3D ARPG网络游戏编程实践] 网络连接 :unity NetWork与socket的对比(一)
- Unity中关于XML和Json的读写
- 【Unity&JSON】LitJson的多对象读写(1)
- 【Unity&JSON】LitJson的多对象读写(2)
- 【Unity&JSON】LitJson的多对象读写(3)
- 【Unity&JSON】LitJson的多对象读写(4)
- 【Unity&JSON】JsonUtility的多对象读写(1)
- 【Unity&JSON】JsonUtility的多对象读写(2)
- CentOS7 配置 vsftpd 服务
- Fiddler手机抓包教程
- Angularjs 如何获取单选的所有内容
- MySQL中的锁(表锁、行锁)
- Nginx有哪些有趣的玩法?
- Unity使用Socket与后台连接,包含Json的读写
- 划分dp,区间差最小
- 解决 win10 pycurl安装出错 Command "python setup.py egg_info" failed with error code 10
- 利用rsyslog 配置用户行为日志审计
- PAT_1043. Is It a Binary Search Tree
- 剑指offer 21. 包含min函数的栈
- Mybatis中接口和对应的mapper文件位置配置详解
- c语言:随机猜数字游戏
- Java 网络编程总结