查看: 908|回复: 0
打印 上一主题 下一主题

[其他] 关于Unity3D TCP通信中 TcpClient使用(代码可用)

[复制链接]
may    

8830

主题

81

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
52368
精华
343

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2019-7-31 23:13:26 |只看该作者 |倒序浏览

来自:实践者
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Net.Sockets;
  6. using System.IO;
  7. using System.Threading;
  8. using System.Collections;
  9. using System.Drawing;
  10.     /// <summary>
  11.     /// 通信类
  12.     /// </summary>
  13.     class Client
  14.     {

  15.         // tcp通信对象
  16.         private TcpClient tcpClient;
  17.                
  18.         // tcp通信中读取数据的对象
  19.         private BinaryReader br;
  20.         // tcp通信中写数据的对象
  21.         private BinaryWriter bw;
  22.                
  23.         // 通信的远程服务端ip
  24.         private string IP;
  25.         // 通信的远程服务端端口
  26.         private int port;
  27.         // 心跳字符串
  28.         string heartString = "#@#@";
  29.         #endregion

  30.         #region 构造函数
  31.         /// <summary>
  32.         /// 构造函数
  33.         /// </summary>
  34.         /// <param name="ip">服务器IP</param>
  35.         /// <param name="port">服务器开放的通信端口号</param>
  36.         public Client(string ip,int port)
  37.         {
  38.             this.IP = ip;
  39.             this.port = port;
  40.         }
  41.         #endregion

  42.         /// <summary>
  43.         /// 重连服务端
  44.         /// </summary>
  45.         public void Reconnect()
  46.         {
  47.             try
  48.             {
  49.                 if (tcpClient!=null)
  50.                 {
  51.                     tcpClient.Close();
  52.                 }              
  53.                 tcpClient = new TcpClient(IP, port);
  54.                 //获取网络流
  55.                 NetworkStream networkStream = tcpClient.GetStream();
  56.                 //将网络流作为二进制读写对象
  57.                 br = new BinaryReader(networkStream);
  58.                 bw = new BinaryWriter(networkStream);
  59.                 if (ConnectSucTexts != null) ConnectSucTexts("已连接到服务端"+IP + ":" + port , Color.Green);
  60.             }
  61.             catch(Exception ex)
  62.             {
  63.                Debug.Log("<color=#FF4500>重连服务端出错:SendHearbeat</color>" + ex.ToString());
  64.             }
  65.         }

  66.         /// <summary>
  67.         /// 连接服务端
  68.         /// </summary>
  69.         public void Connect()
  70.         {
  71.             try
  72.             {
  73.                 tcpClient = new TcpClient(IP, port);
  74.                 //获取网络流
  75.                 NetworkStream networkStream = tcpClient.GetStream();
  76.                 //将网络流作为二进制读写对象
  77.                 br = new BinaryReader(networkStream);
  78.                 bw = new BinaryWriter(networkStream);
  79.                 if (ConnectSucTexts != null) ConnectSucTexts("已连接到服务端" + IP + ":" + port, Color.Green);
  80.             }
  81.             catch(Exception ex)
  82.             {
  83.                Debug.Log("<color=#FF4500>连接服务端出错:SendHearbeat</color>" + ex.ToString());
  84.             }
  85.             IniThread();               
  86.         }

  87.         private void IniThread()
  88.         {
  89.             //后台消息消息线程
  90.             Thread threadHeart = new Thread(new ThreadStart(ReceiveData));
  91.             threadHeart.IsBackground = true;
  92.             threadHeart.Start();

  93.             //后台心跳消息线程
  94.             Thread threadRec = new Thread(new ThreadStart(SendHeart));
  95.             threadRec.IsBackground = true;
  96.             threadRec.Start();
  97.         }

  98.         

  99.         /// <summary>
  100.         /// 给服务端发心跳,10秒一次
  101.         /// </summary>
  102.         private void SendHeart()
  103.         {
  104.             while (true)
  105.             {
  106.                 Thread.Sleep(10000);
  107.                 SendMsg(heartString);
  108.             }
  109.         }
  110.         

  111.         /// <summary>
  112.         /// 发送消息到服务端的方法,带发送长度 type=0心跳,1其他
  113.         /// </summary>
  114.         /// <param name="msg">消息内容</param>
  115.         public void SendMsg(string msgs,int type=0)
  116.         {
  117.             try
  118.             {
  119.                 byte[] msg = Encoding.Default.GetBytes(msgs);
  120.                 int length = msg.Length;
  121.                 short lengthall = (short)(length + 2);
  122.                 byte[] lengthByte = System.BitConverter.GetBytes(lengthall);// ToBytesArray(lengthall);
  123.                 byte[] all = lengthByte.Concat(msg).ToArray();
  124.                 //然后将字节数组写入网络流
  125.                 if (bw != null && tcpClient.Connected==true)
  126.                 {
  127.                         bw.Write(all);
  128.                         bw.Flush();
  129.                         if (msgs == heartString)//心跳写单独的文件
  130.                         {
  131.                             ClassVar.WriteLogCommonXT(Environment.NewLine + "成功给服务端发送数据:" + msgs);
  132.                         }
  133.                         else
  134.                         {
  135.                             ClassVar.WriteLogCommon(Environment.NewLine + "成功给服务端发送数据:" + msgs);
  136.                         }
  137.                 }
  138.                 else
  139.                 {
  140.                     this.Reconnect();
  141.                 }
  142.             }
  143.             catch (Exception ex)
  144.             {
  145.                 Debug.Log("<color=#FF4500>发送消息到服务端出错:SendHearbeat</color>" + ex.ToString());
  146.             }
  147.         }

  148.       

  149.         /// <summary>
  150.         /// 处理接收的服务端数据
  151.         /// </summary>
  152.         private void ReceiveData()
  153.         {      
  154.             while (true)
  155.             {
  156.                 byte[] BytesLenth = null;
  157.                 byte[] BytesContent = null;
  158.                 if (br == null) continue;
  159.                 try
  160.                 {                 
  161.                     BytesLenth = br.ReadBytes(2);
  162.                     int lenth = BitConverter.ToInt16(BytesLenth, 0);
  163.                     BytesContent = br.ReadBytes(lenth - 2);
  164.                     string conContent = Encoding.Default.GetString(BytesContent);

  165.                     //conContent就是接受到的数据
  166.                 }
  167.                 catch (Exception ex)
  168.                 {                  
  169.                    Debug.Log("<color=#FF4500>处理接收的服务端数据出错:SendHearbeat</color>" + ex.ToString());
  170.                 }
  171.             }
  172.         }
复制代码
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-6-30 15:10 , Processed in 0.067430 second(s), 29 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部