unity3D与Socket通信_01

来源:互联网 发布:mac 查看php版本 编辑:程序博客网 时间:2024/06/05 23:55

我会持续记录自己unity与socket交互从入门到运用到项目中的经历,今天带来一个入门的简单Demo,了解socket基本原理,一些用法基本在代码注释里说的很清楚

新建一个工程,新建一个场景把Server脚本挂在到相机或者空对象上保存发布成.exe


再新建一个新场景把Client脚本挂载到相机上,同时运行这两个


记得多点击下服务端的exe 防止在后台休眠,然后点击unity里的客户端的鼠标左键与服务端进行通讯


功能原理在脚本里有详细注释,希望对你有用!!


服务端代码:

using UnityEngine;using System.Collections;using System.Net;using System.Net.Sockets;using System;using System.Threading;using System.Collections.Generic;using System.Text;public class Server : MonoBehaviour {private Socket socketSever;bool isRuning=true;//开一个线程接受操作private void listenRecv(){while (isRuning) {try{socketSever.BeginAccept(new AsyncCallback(AsyncAcceptCallBack),socketSever);}catch(Exception e){}Thread.Sleep (1000);}}//连接回调void AsyncAcceptCallBack(IAsyncResult ar){//从内核得到连接请求Socket listener = (Socket)ar.AsyncState;//堵塞的 直到客服端有请求Socket clientSocket = listener.EndAccept (ar);SocketSatte socketstate = new SocketSatte (clientSocket);socketArr.Add (socketstate);//添加客服端请求}List<SocketSatte> socketArr;private void IntialScoket(){//跟电脑端网卡进行绑定,与接口发送数据,IPAddress.Any电脑自动选择最优网卡进行通讯IPEndPoint enpoint = new IPEndPoint (IPAddress.Any,18010);socketSever = new Socket (enpoint.AddressFamily,SocketType.Stream,ProtocolType.Tcp);socketSever.Bind (enpoint);//绑定端口(把socket和网卡,端口号进行绑定)socketSever.Listen(38);//监听端口(服务端特有的),可以接受38台机器的连接请求Thread thread=new Thread(listenRecv);thread.Start ();socketArr = new List<SocketSatte> ();}void Start(){IntialScoket (); }void Update(){if (socketArr.Count > 0) {for (int i = 0; i < socketArr.Count; ++i) {socketArr [i].BeginRecv ();}}}void OnApplicationQuit(){socketSever.Shutdown (SocketShutdown.Both);socketSever.Close ();}}public class SocketSatte{public Socket socket;public byte[] buffer;public SocketSatte(Socket tempsocket){buffer=new byte[1024];socket = tempsocket;}void RecCallBack(IAsyncResult ar){//从服务端接受的数据字节流大小int length = socket.EndReceive (ar);string ss = Encoding.Default.GetString (buffer,0,length);Debug.Log ("服务端接受的数据:"+ss);BeginSend (ss);}public void BeginRecv(){socket.BeginReceive (buffer,0,1024,SocketFlags.None,RecCallBack,this);}void SendCallBack(IAsyncResult ar){int byteSend = socket.EndSend (ar);Debug.Log ("服务端发送的字节个数:"+byteSend);}public void BeginSend(string ss){byte[] data = Encoding.Default.GetBytes (ss);;socket.BeginSend (data,0,data.Length,SocketFlags.None,SendCallBack,this);}}
客服端代码:
using UnityEngine;using System.Collections;using System.Net;using System.Net.Sockets;using System;using System.Threading;using System.Collections.Generic;using System.Text;public class Client : MonoBehaviour {Socket client;public byte[]bydata=new byte[1024];void Intail(){//服务端地址IPAddress ipaddress = IPAddress.Parse ("127.0.0.1");//服务器的地址和端口IPEndPoint ipend = new IPEndPoint (ipaddress,18010);client = new Socket (AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//三次握手client.BeginConnect (ipend,new AsyncCallback(ConnectCallBack),client);}public void ConnectCallBack(IAsyncResult ar){client.EndConnect (ar);Debug.Log ("与服务器完成三次握手");}void RecvCallBack(IAsyncResult ar){int length = client.EndReceive (ar);string ss = Encoding.Default.GetString (bydata,0,length);Debug.Log ("客服端接受的数据:"+ss);}void BeginRecv(){client.BeginReceive (bydata,0,1024,SocketFlags.None,RecvCallBack,this);}void Start () {Intail ();}void SendCallBack(IAsyncResult ar){int byteSend = client.EndSend (ar);Debug.Log ("客服端数据发送的字节个数"+byteSend);}void BeginSend(string ss){byte[] data = Encoding.Default.GetBytes (ss);client.BeginSend (data,0,data.Length,SocketFlags.None,SendCallBack,this);}// Update is called once per framevoid Update () {if (Input.GetMouseButtonDown (0)) {BeginSend ("12321314");}BeginRecv ();}void OnApplicationQuit(){client.Shutdown (SocketShutdown.Both);client.Close ();}}

原创粉丝点击