unity socket学习(二)

来源:互联网 发布:手机弹古筝软件 编辑:程序博客网 时间:2024/05/14 14:06

转载于:圣典的unity csharp socket 异步通信 客户端http://game.ceeger.com/forum/read.php?tid=1478

 

unity csharp socket 异步通信 客户端作者:围城(solq)bolg:http://www.cnblogs.com/solq/服务端用java nio 测试过是可以的。。。。 ... demo : http://unitysgui.sinaapp.com/chatusing UnityEngine;using System.Collections;using System.Net.Sockets;using System.Net;using System;using System.Text;using System.Threading; public class TestAsyncSocketClient2 : MonoBehaviour{    private Socket client = null;    private string ip = "127.0.0.1";    private int port = 8989;     private int size = 1024;    private byte[] readData = new byte[1024];    private byte[] data = new byte[1024];    void Start()                          {        //  socket2.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 多socket 复用同一端口        client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);        IPEndPoint address = new IPEndPoint(IPAddress.Parse(ip), port);        //client.Blocking = false;        client.BeginConnect(address, new AsyncCallback(Connected), null); //建立异步连接服务 , Connected 进行监听        //connectDone.WaitOne();    }    void Connected(IAsyncResult iar)    //建立连接    {       //Socket client = (Socket)iar.AsyncState;       client.EndConnect(iar);        //client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client);        echo("建立连接");     }    void Send(string str)    {        byte[] msg = Encoding.UTF8.GetBytes(str);        client.BeginSend(msg, 0, msg.Length, SocketFlags.None, new AsyncCallback(SendData), client);    //开始发送    }    void SendData(IAsyncResult iar) //发送数据    {        Socket remote = (Socket)iar.AsyncState;        int sent = remote.EndSend(iar);         //关闭发送        remote.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(ReceiveData), remote);   //开始接收    }       void Update()    {        startReceive(); //这步很重要,,,不然会收不到服务器发过来的消息    }    bool ReceiveFlag = true;    void startReceive()    {        if (ReceiveFlag) {            ReceiveFlag = false;            client.BeginReceive(readData, 0, readData.Length, SocketFlags.None, new AsyncCallback(endReceive), client);        }               }     void endReceive(IAsyncResult iar) //接收数据    {        ReceiveFlag = true;        Socket remote = (Socket)iar.AsyncState;        int recv = remote.EndReceive(iar);        if (recv > 0)        {            string stringData = Encoding.UTF8.GetString(readData, 0, recv);            text2 += "\n" + "接收服务器数据:+++++++++++++++" + stringData;        }     }    void ReceiveData(IAsyncResult iar) //接收数据    {        Socket remote = (Socket)iar.AsyncState;        int recv = remote.EndReceive(iar);          //关闭接收 注意:如果关闭了接收,就不能接收了 测试是这样         string stringData = Encoding.UTF8.GetString(data, 0, recv);        text2 += "\n" + "回收发送数据:+++++++++++++++" + stringData;     }      void CloseSocket()                  //关闭socket    {        if (client.Connected)        {            echo("关闭socket");            client.Close();        }                }    void OnApplicationQuit()    {        CloseSocket();    }     void echo(object msg)    {        Debug.Log(msg);    }     string text = "";    string text2 = "";    Vector2 p = new Vector2(600, 300);    void OnGUI()    {        GUILayout.BeginVertical(GUILayout.Width(500) );            text = GUILayout.TextField(text);            if (GUILayout.Button("发送数据"))            {                Send(text);            }            GUILayout.BeginScrollView(p);            text2 = GUILayout.TextArea(text2, GUILayout.Height(300));            GUILayout.EndScrollView();        GUILayout.EndVertical();     } }