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服务器传输数据的更多相关文章

  1. [转]unity3d 脚本参考-技术文档

    unity3d 脚本参考-技术文档 核心提示:一.脚本概览这是一个关于Unity内部脚本如何工作的简单概览.Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的.在脚本对象内部不同志的函数被 ...

  2. workerman是一个高性能的PHP socket服务器框架

    workerman-chatorkerman是一款纯PHP开发的开源高性能的PHP socket服务器框架.被广泛的用于手机app.手游服务端.网络游戏服务器.聊天室服务器.硬件通讯服务器.智能家居. ...

  3. Unity3D脚本中文系列教程(十五)

    http://dong2008hong.blog.163.com/blog/static/4696882720140322449780/ Unity3D脚本中文系列教程(十四) ◆ LightRend ...

  4. Unity3D脚本中文系列教程(十四)

    http://dong2008hong.blog.163.com/blog/static/469688272014032134394/ WWWFrom 类Unity3D脚本中文系列教程(十三)辅助类. ...

  5. Unity3D脚本中文系列教程(十)

    http://dong2008hong.blog.163.com/blog/static/4696882720140312627682/?suggestedreading&wumii Unit ...

  6. Unity3D脚本中文系列教程(四)

    http://dong2008hong.blog.163.com/blog/static/4696882720140302451146/ Unity3D脚本中文系列教程(三) 送到动画事件. ◆ va ...

  7. Unity3D教程宝典之Web服务器篇:(第二讲)从服务器下载图片

    转载自风宇冲Unity3D教程学院                                    从Web服务器下载图片 上一讲风宇冲介绍了wamp服务器及安装.这回介绍如何从服务器下载内容至 ...

  8. 通过监控线程状态来保证socket服务器的稳定运行

    云平台中使用的socket服务器是我们自己定义一套通信协议,并通过C#实现的一个socket服务. 该服务目前是和web服务一起运行在IIS容器中,通过启动一个永不退出的新线程来监听端口. 在开发的初 ...

  9. Java NIO 非阻塞Socket服务器构建

    推荐阅读IBM developerWorks中NIO的入门教程,尤其是对块I/O和流I/O不太清楚的开发者. 说到socket服务器,第一反应是java.net.Socket这个类.事实上在并发和响应 ...

随机推荐

  1. python--pycharm汉化

    一.准备工具 1.pycharm软件 2.汉化包 二.解压汉化包 三.将resources_cn.jar复制到pycharm文件中lib目录下 四.重新打开pycharm

  2. js 对象可枚举属性以及for in 循环和for of 循环

    js中每个对象的属性(js里万物皆属性,对象的属性也是对象)都有一个属性叫enumerable(可枚举性),这个属性true/false决定了该对象的属性是否可枚举(就是让一些方法访问到这个属性). ...

  3. UVA - 11324 The Largest Clique (强连通缩点+dp)

    题目链接 题意:从有向图G中找到一个最大的点集,使得该点集中任意两个结点u,v满足u可达v或v可达u. 解法:先把同处于一个强连通分量中的结点合并(缩点),得到一张DAG图,在DAG上dp即可. 感觉 ...

  4. 20179203 《Linux内核原理与分析》第十二周作业

    Return-to-libc 攻击实验 一.实验描述 缓冲区溢出的常用攻击方法是用 shellcode 的地址来覆盖漏洞程序的返回地址,使得漏洞程序去执行存放在栈中 shellcode.为了阻止这种类 ...

  5. 1151 LCA in a Binary Tree(30 分)

    The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both U ...

  6. /etc删了怎么办

    实施一个哥们一个手抖,把/etc删掉了:别人无法ssh到上面,除了他.怎么办? 从类似的OK机器中打包一个etc.tar,然后将etc.tar放到OK机器www服务器目录里面:然后在问题机器上面通过w ...

  7. Angular5学习笔记 - 创建、运行、发布项目(一)

    一.安装脚手架 npm install -g cnpm --registry=https://registry.npm.taobao.org #安装阿里镜像 npm install -g @angul ...

  8. L2-020. 功夫传人(dfs+vector 或者 邻接矩阵+dij+优先队列)

    L2-020. 功夫传人 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一门武功能否传承久远并被发扬光大,是要看缘分的.一般来 ...

  9. AngularJS:事件

    ylbtech-AngularJS:事件 1.返回顶部 1. AngularJS 事件 AngularJS 有自己的 HTML 事件指令. ng-click 指令 ng-click 指令定义了 Ang ...

  10. TCG卡牌游戏研究:《炉石战记:魔兽英雄传》所做的改变

    转自:http://www.gameres.com/665306.html TCG演进史 说到卡牌游戏,大家会联想到什么呢? 是历史悠久的扑克牌.风靡全球的<MTG 魔法风云会>与< ...