• unity csharp socket 异步通信 客户端 作者:围城(solq)


    unity csharp socket 异步通信 客户端
    作者:围城(solq)
    bolg:http://www.cnblogs.com/solq/
    服务端用java nio 测试过是可以的。。。。 ...
     demo : http://unitysgui.sinaapp.com/chat

    转载请注明出处。。。。。。。

    View Code
    using 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();
    
        }
    
    }
  • 相关阅读:
    存储过程简介
    微信公众号开发之授权获取用户信息
    微信公众号开发之自定义菜单
    微信公众号开发之如何实现消息交互
    VS2012创建ATL工程及使用MFC测试COM组件
    Regsvr32 在64位机器上的用法(转载)
    模块加载失败 请确保该二进制文件在指定的路径中 找不到指定的模块(转载)
    [内核驱动] miniFilter 内核层与应用程序通信
    [内核驱动] VS2012+WDK 8.0 Minifilter实现指定扩展名文件拒绝访问
    InstallShield 2015 生成单个EXE包和 MSI包
  • 原文地址:https://www.cnblogs.com/solq/p/2467342.html
Copyright © 2020-2023  润新知