Unity3d 脚本与C#Socket服务器传输数据

摘要:
成功){//超时已关闭();Debug.Log;}否则{//Debug.Log;//与套接字的连接已成功建立。启动线程以接受服务器数据。

Test.cs脚本

---------------------------------------------------------------------------------------------------------------------------------------------------

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using AssemblyCSharp;
using System.Text;
using System;
using System.Threading;

public class Test : MonoBehaviour {
  private JFSocket mJFSocket;
  // Use this for initialization
  void Start () {

    mJFSocket = JFSocket.GetInstance();
  }
  // Update is called once per frame
  void Update () {
    if(mJFSocket!=null){
      Debug.Log (mJFSocket.receive_msg);
    }
  }
}

---------------------------------------------------------------------------------------------------------------------------------------------------

SocketClientTest.cs

---------------------------------------------------------------------------------------------------------------------------------------------------

using UnityEngine;
using System.Collections;
using System;
using System.Threading;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;


namespace AssemblyCSharp
{
  public class SocketClientTest
  {
    //Socket客户端对象
    private Socket clientSocket;
    //单例模式
    private static SocketClientTest instance;
    public string receive_msg = "";
    public static SocketClientTest GetInstance()
    {
      if (instance == null)
      {
        instance = new SocketClientTest();
      }
      return instance;
    }

    //单例的构造函数
    SocketClientTest()
    {
      //创建Socket对象, 这里我的连接类型是TCP
      clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
      //服务器IP地址
      IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
      //服务器端口
      IPEndPoint ipEndpoint = new IPEndPoint(ipAddress, 5209);
      //这是一个异步的建立连接,当连接建立成功时调用connectCallback方法
      IAsyncResult result = clientSocket.BeginConnect(ipEndpoint, new AsyncCallback(connectCallback), clientSocket);
      //这里做一个超时的监测,当连接超过5秒还没成功表示超时
      bool success = result.AsyncWaitHandle.WaitOne(5000, true);
      if (!success)
      {
        //超时
        Closed();
        Debug.Log("connect Time Out");
      }
      else
      {
        //Debug.Log ("与socket建立连接成功,开启线程接受服务端数据");
        //与socket建立连接成功,开启线程接受服务端数据。
        Thread thread = new Thread(new ThreadStart(ReceiveSorketMsg));
        thread.IsBackground = true;
        thread.Start();
      }
    }

    private void connectCallback(IAsyncResult asyncConnect)
    {
      Debug.Log("connectSuccess");
    }

    private void ReceiveSorketMsg()
    {
      Console.WriteLine ("wait---");
      //在这个线程中接受服务器返回的数据
      while (true)
      {
        if (!clientSocket.Connected)
        {
          //与服务器断开连接跳出循环
          Debug.Log("Failed to clientSocket server.");
          clientSocket.Close();
          break;
        }
        try
        {
          //接受数据保存至bytes当中
          byte[] bytes = new byte[4096];
          //Receive方法中会一直等待服务端回发消息
          //如果没有回发会一直在这里等着。
          int i = clientSocket.Receive(bytes);
          if (i <= 0)
          {
            clientSocket.Close();
            break;
          }
          Debug.Log(Encoding.ASCII.GetString(bytes, 0, i));
          if (bytes.Length > 8)
          {
            //Console.WriteLine("接收服务器消息:{0}", Encoding.ASCII.GetString(bytes, 0, i));
            receive_msg = Encoding.ASCII.GetString(bytes, 0, i);
          }
          else
          {
            Debug.Log("length is not > 8");
          }
        }
        catch (Exception e)
        {
          Debug.Log("Failed to clientSocket error." + e);
          clientSocket.Close();
          break;
        }
      }
    }

    //关闭Socket
    public void Closed()
    {
      if (clientSocket != null && clientSocket.Connected)
      {
        clientSocket.Shutdown(SocketShutdown.Both);
        clientSocket.Close();
      }
      clientSocket = null;
    }
  }
}

---------------------------------------------------------------------------------------------------------------------------------------------------

Socket服务端代码:

using System;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace SocketServerTest01
{
  class Program
  {
    private static byte[] result = new byte[1024];
    private static int myProt = 5209; //端口
    static Socket serverSocket;
    static void Main(string[] args)
    {
      //服务器IP地址
      IPAddress ip = IPAddress.Parse("127.0.0.1");
      serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
      serverSocket.Bind(new IPEndPoint(ip, myProt)); //绑定IP地址:端口
      serverSocket.Listen(10); //设定最多10个排队连接请求
      Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString());
      //通过Clientsoket发送数据
      Socket clientSocket = serverSocket.Accept();
      while (true) {
        Thread.Sleep(1000);
        SendMsg(clientSocket);
      }
    }

    /// <summary>
    /// 以每秒一次的频率发送数据给客户端
    /// </summary>
    /// <param name="clientSocket"></param>
    public static void SendMsg(Socket clientSocket)
    {
      try
      {
        clientSocket.Send(Encoding.ASCII.GetBytes(GetRandomData()));
      }
      catch {
        Console.WriteLine("服务器异常");
        return;
      }
    }

    /// <summary>
    /// 产生随机字符串
    /// </summary>
    /// <returns></returns>
    private static string GetRandomData()
    {
      Random ran = new Random();
      int x = ran.Next(50,200);
      int y = ran.Next(20,100);
      int z = 1000;
      int ID = ran.Next(1,30);
      string str = "ID:"+ID+"-x:"+x+"-y:"+y+"-z:"+z;
      return str;
    }
  }
}

免责声明:文章转载自《Unity3d 脚本与C#Socket服务器传输数据》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇查找正序排列的List中缺失的日期数据的一个算法perl学习一:探索Perl世界下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Unity UGUI-Raw Image 组件(生图/未加工图片)

许久没有添加U3D随笔了,今补一条关于U3D亲儿子的东东 Unity UGUI-Raw Image 组件   Raw Image 组件是一个显示纹理贴图的组件   搭配 RenderTexture 将会有奇效   Raw Image 与 Image 的区别:   Image 显示的是 Sprite 精灵图片   Raw Image 可显示任何纹理贴图 (...

pythonTCP UDP IPv4 IPv6 客户端和服务端的实现

由于目前工作的需要,需要在IPv4和IPv6两种网络模式下TCP和UDP的连接,要做到客户端发包,服务端收包。 前几天写了代码,但是把UDP的客户端和服务端使用TCP模式的代码了。今天在公司使用该工具的时候,发现了问题,忘记了UDP不需要验证。疏忽,疏忽。不过刚刚接触编程,可以原谅。 现在在家,已经把代码改好了。经测试可以使用。 先运行客户端: pytho...

unity3D 2D游戏碰撞道具增加气血效果&受伤掉血效果

代码并不高效,仅以实现效果为目的. 被攻击时调用(需要传入HP预制件父级对象) 1 //受到伤害时,掉血 2 public void OnHurt(Transform HP) 3 { 4 print("触碰到了怪物..."); 5 //遍历父级对象 6 for (int i =...

xe 最大连接数限制、记录客户连接、心跳

xe 最大连接数限制、记录客户连接、心跳 //author: cxg unit DSServerContainer; interface usesSysUtils, Classes, IniFiles, Windows, Provider, DBClient,DSTCPServerTransport,DSServer, DSCommonServer, DB...

比较windows phone程序启动和android程序启动原理

 windows phone 程序是如何启动的了,他和android程序有什么区别,我们重点从native code 层面来分析  在windows phone 程序启动的时候是: 在XAML中使用应用程序定义指定起始Page(它是启动 WindowsPhone7程序时自动加载的Page)。  指定方法是将 StartupUri 属性设置为所需的 Page...

Windows下重叠I/O模型

一.重叠模型的优点 1.可以运行在支持Winsock2的所有Windows平台 ,而不像完成端口只是支持NT系统。 2.比起阻塞、select、WSAAsyncSelect以及WSAEventSelect等模型,重叠I/O(Overlapped I/O)模型使应用程序能达到更佳的系统性能。 因为它和这4种模型不同的是,使用重叠模型的应用程序通知缓冲区收发...