Unity3d 分别创建了两个线程客户端 服务器连接的简单示例

本文主要是介绍Unity3d 分别创建了两个线程客户端 服务器连接的简单示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[javascript]  view plain copy print ?
  1. //分别创建了两个线程客户端 服务器连接的简单示例   
  2.   
  3. using UnityEngine;  
  4.   
  5. using System;  
  6.   
  7. using System.Collections;  
  8.   
  9. using System.Threading;  
  10.   
  11. using System.Net.Sockets;  
  12.   
  13. using System.Net;  
  14.   
  15. using System.Text;  
  16.   
  17. public class TCPIPClientServer : MonoBehaviour  
  18.   
  19. {  
  20.   
  21.     void Start()  
  22.   
  23.     {  
  24.   
  25.         Debug.Log(GetIP().ToString());  
  26.   
  27.     }  
  28.   
  29.     public static Socket ClientSocket;  
  30.   
  31.     private void InitConnect()  
  32.   
  33.     {  
  34.   
  35.         ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  
  36.   
  37.         string ip = GetIP().ToString();//服务器ip  
  38.   
  39.         IPAddress ipa = IPAddress.Parse(ip);  
  40.   
  41.         IPEndPoint iep = new IPEndPoint(ipa, 8000);  
  42.   
  43.         try  
  44.   
  45.         {  
  46.   
  47.             ClientSocket.Connect(iep);//连接到服务器  
  48.   
  49.             Thread thread = new Thread(new ThreadStart(ClientReceive));  
  50.   
  51.             thread.Start();  
  52.   
  53.         }  
  54.   
  55.         catch (Exception ex)  
  56.   
  57.         {  
  58.   
  59.             Debug.Log(ex.Message);  
  60.   
  61.             clientReceiveValue = ex.Message;  
  62.   
  63.         }  
  64.   
  65.     }  
  66.   
  67.   
  68.   
  69.     /*接收来自服务器上的信息*/  
  70.   
  71.     public void ClientReceive()  
  72.   
  73.     {  
  74.   
  75.         clientReceiveValue = "已经建立连接准备接受数据";  
  76.   
  77.         while (true)  
  78.   
  79.         {  
  80.   
  81.             byte[] bytes = new byte[100];  
  82.   
  83.             int rev = ClientSocket.Receive(bytes, bytes.Length, 0);//将数据从连接的   Socket   接收到接收缓冲区的特定位置。  
  84.   
  85.             if (rev <= 0)  
  86.   
  87.             {  
  88.   
  89.                 break;  
  90.   
  91.             }  
  92.   
  93.             string strev = System.Text.Encoding.Default.GetString(bytes);  
  94.   
  95.             clientReceiveValue = ("服务器对客户端说:" + strev + "\r\n");  
  96.   
  97.         }  
  98.   
  99.     }  
  100.   
  101.   
  102.   
  103.   
  104.   
  105.     private void ClientSend()  
  106.   
  107.     {  
  108.   
  109.         if (ClientSocket.Connected)//判断Socket是否已连接  
  110.   
  111.         {  
  112.   
  113.   
  114.   
  115.             byte[] SendMessage = new byte[100];  
  116.   
  117.             SendMessage = Encoding.ASCII.GetBytes(clientSendValue);  
  118.   
  119.             ClientSocket.Send(SendMessage);//从数据中的指示位置开始将数据发送到连接的Socket。  
  120.   
  121.   
  122.   
  123.         }  
  124.   
  125.         else  
  126.   
  127.         {  
  128.   
  129.             Debug.Log("未建立连接!");  
  130.   
  131.             clientSendValue = "未建立连接!";  
  132.   
  133.         }  
  134.   
  135.     }  
  136.   
  137.   
  138.   
  139.     private string clientReceiveValue = "";  
  140.   
  141.     private string clientSendValue = "";  
  142.   
  143.     private string serverReceiveValue = "";  
  144.   
  145.     private string serverSendValue = "";  
  146.   
  147.     void OnGUI()  
  148.   
  149.     {  
  150.   
  151.         //服务器  
  152.   
  153.         GUI.TextField(new Rect(100, 100, 200, 50), serverReceiveValue);  
  154.   
  155.         if (GUI.Button(new Rect(310, 100, 100, 20), "开始监听"))  
  156.   
  157.         {  
  158.   
  159.             Listen();  
  160.   
  161.         }  
  162.   
  163.         serverSendValue = GUI.TextField(new Rect(100, 150, 200, 40), serverSendValue);  
  164.   
  165.         if (GUI.Button(new Rect(310, 150, 100, 20), "服务器发送"))  
  166.   
  167.         {  
  168.   
  169.             SeverSend();  
  170.   
  171.         }  
  172.   
  173.   
  174.   
  175.         ///客户端  
  176.   
  177.         GUI.TextField(new Rect(100, 350, 200, 40), clientReceiveValue);  
  178.   
  179.         if (GUI.Button(new Rect(310, 350, 100, 20), "连接服务器"))  
  180.   
  181.         {  
  182.   
  183.             InitConnect();  
  184.   
  185.   
  186.   
  187.         }  
  188.   
  189.   
  190.   
  191.         clientSendValue = GUI.TextField(new Rect(100, 400, 200, 40), clientSendValue);  
  192.   
  193.         if (GUI.Button(new Rect(310, 400, 100, 20), "客户端发送"))  
  194.   
  195.         {  
  196.   
  197.             ClientSend();  
  198.   
  199.         }  
  200.   
  201.     }  
  202.   
  203.   
  204.   
  205.   
  206.   
  207.     Thread LisThread;  
  208.   
  209.     Socket LisSocket;  
  210.   
  211.     Socket newSocket;  
  212.   
  213.     EndPoint point;  
  214.   
  215.     string strmes = String.Empty;  
  216.   
  217.     int port = 8000;//定义侦听端口号  
  218.   
  219.     private void Listen()  
  220.   
  221.     {  
  222.   
  223.         LisThread = new Thread(new ThreadStart(BeginListern));//开线程执行BeginListern方法  
  224.   
  225.         LisThread.Start();//线程开始执行  
  226.   
  227.         serverReceiveValue = GetIP().ToString() + "正在监听 ";  
  228.   
  229.     }  
  230.   
  231.   
  232.   
  233.     private void BeginListern()  
  234.   
  235.     {  
  236.   
  237.         LisSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//实例化Socket  
  238.   
  239.         IPAddress ServerIp = GetIP();/*获取本地服务器的ip地址  */  
  240.   
  241.         IPEndPoint iep = new IPEndPoint(ServerIp, port);  
  242.   
  243.   
  244.   
  245.         LisSocket.Bind(iep); /*将Socket绑定ip */  
  246.   
  247.         LisSocket.Listen(50); //Socket开始监听  
  248.   
  249.         newSocket = LisSocket.Accept();//获取连接请求的Socket  
  250.   
  251.         /*接收客户端Socket所发的信息  */  
  252.   
  253.         while (true)  
  254.   
  255.         {  
  256.   
  257.             try  
  258.   
  259.             {  
  260.   
  261.   
  262.   
  263.                 byte[] byteMessage = new byte[100];  
  264.   
  265.                 newSocket.Receive(byteMessage);//接收信息  
  266.   
  267.                 point = newSocket.RemoteEndPoint;//获取客户端的Socket的相关信息  
  268.   
  269.                 IPEndPoint IPpoint = (IPEndPoint)point;  
  270.   
  271.                 strmes += IPpoint.Address.ToString() + "说" + Encoding.Default.GetString(byteMessage).Trim(new char[] { '\0' }) + "\r\n";  
  272.   
  273.                 serverReceiveValue = strmes;  
  274.   
  275.             }  
  276.   
  277.   
  278.   
  279.             catch (SocketException ex)  
  280.   
  281.             {  
  282.   
  283.                 Debug.Log(ex.ToString());  
  284.   
  285.                 serverReceiveValue = ex.ToString();  
  286.   
  287.             }  
  288.   
  289.         }  
  290.   
  291.     }  
  292.   
  293.   
  294.   
  295.     private IPAddress GetIP()  
  296.   
  297.     {     /*获取本地服务器的ip地址  */  
  298.   
  299.         IPHostEntry iep = Dns.GetHostEntry(Dns.GetHostName());  
  300.   
  301.         IPAddress ip = iep.AddressList[0];  
  302.   
  303.         return ip;  
  304.   
  305.     }  
  306.   
  307.   
  308.   
  309.     private void SeverSend()  
  310.   
  311.     {  
  312.   
  313.         byte[] byteData = Encoding.Default.GetBytes(serverSendValue);  
  314.   
  315.         newSocket.Send(byteData);//发送信息即由服务器往客户端上发信息  
  316.   
  317.     }  
  318.   
  319.   
  320.   
  321. }  

这篇关于Unity3d 分别创建了两个线程客户端 服务器连接的简单示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1116759

相关文章

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

python如何创建等差数列

《python如何创建等差数列》:本文主要介绍python如何创建等差数列的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python创建等差数列例题运行代码回车输出结果总结python创建等差数列import numpy as np x=int(in

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信