纳金网
标题:
关于Unity3D TCP通信中 TcpClient使用(代码可用)
[打印本页]
作者:
may
时间:
2019-7-31 23:13
标题:
关于Unity3D TCP通信中 TcpClient使用(代码可用)
来自:实践者
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Collections;
using System.Drawing;
/// <summary>
/// 通信类
/// </summary>
class Client
{
// tcp通信对象
private TcpClient tcpClient;
// tcp通信中读取数据的对象
private BinaryReader br;
// tcp通信中写数据的对象
private BinaryWriter bw;
// 通信的远程服务端ip
private string IP;
// 通信的远程服务端端口
private int port;
// 心跳字符串
string heartString = "#@#@";
#endregion
#region 构造函数
/// <summary>
/// 构造函数
/// </summary>
/// <param name="ip">服务器IP</param>
/// <param name="port">服务器开放的通信端口号</param>
public Client(string ip,int port)
{
this.IP = ip;
this.port = port;
}
#endregion
/// <summary>
/// 重连服务端
/// </summary>
public void Reconnect()
{
try
{
if (tcpClient!=null)
{
tcpClient.Close();
}
tcpClient = new TcpClient(IP, port);
//获取网络流
NetworkStream networkStream = tcpClient.GetStream();
//将网络流作为二进制读写对象
br = new BinaryReader(networkStream);
bw = new BinaryWriter(networkStream);
if (ConnectSucTexts != null) ConnectSucTexts("已连接到服务端"+IP + ":" + port , Color.Green);
}
catch(Exception ex)
{
Debug.Log("<color=#FF4500>重连服务端出错:SendHearbeat</color>" + ex.ToString());
}
}
/// <summary>
/// 连接服务端
/// </summary>
public void Connect()
{
try
{
tcpClient = new TcpClient(IP, port);
//获取网络流
NetworkStream networkStream = tcpClient.GetStream();
//将网络流作为二进制读写对象
br = new BinaryReader(networkStream);
bw = new BinaryWriter(networkStream);
if (ConnectSucTexts != null) ConnectSucTexts("已连接到服务端" + IP + ":" + port, Color.Green);
}
catch(Exception ex)
{
Debug.Log("<color=#FF4500>连接服务端出错:SendHearbeat</color>" + ex.ToString());
}
IniThread();
}
private void IniThread()
{
//后台消息消息线程
Thread threadHeart = new Thread(new ThreadStart(ReceiveData));
threadHeart.IsBackground = true;
threadHeart.Start();
//后台心跳消息线程
Thread threadRec = new Thread(new ThreadStart(SendHeart));
threadRec.IsBackground = true;
threadRec.Start();
}
/// <summary>
/// 给服务端发心跳,10秒一次
/// </summary>
private void SendHeart()
{
while (true)
{
Thread.Sleep(10000);
SendMsg(heartString);
}
}
/// <summary>
/// 发送消息到服务端的方法,带发送长度 type=0心跳,1其他
/// </summary>
/// <param name="msg">消息内容</param>
public void SendMsg(string msgs,int type=0)
{
try
{
byte[] msg = Encoding.Default.GetBytes(msgs);
int length = msg.Length;
short lengthall = (short)(length + 2);
byte[] lengthByte = System.BitConverter.GetBytes(lengthall);// ToBytesArray(lengthall);
byte[] all = lengthByte.Concat(msg).ToArray();
//然后将字节数组写入网络流
if (bw != null && tcpClient.Connected==true)
{
bw.Write(all);
bw.Flush();
if (msgs == heartString)//心跳写单独的文件
{
ClassVar.WriteLogCommonXT(Environment.NewLine + "成功给服务端发送数据:" + msgs);
}
else
{
ClassVar.WriteLogCommon(Environment.NewLine + "成功给服务端发送数据:" + msgs);
}
}
else
{
this.Reconnect();
}
}
catch (Exception ex)
{
Debug.Log("<color=#FF4500>发送消息到服务端出错:SendHearbeat</color>" + ex.ToString());
}
}
/// <summary>
/// 处理接收的服务端数据
/// </summary>
private void ReceiveData()
{
while (true)
{
byte[] BytesLenth = null;
byte[] BytesContent = null;
if (br == null) continue;
try
{
BytesLenth = br.ReadBytes(2);
int lenth = BitConverter.ToInt16(BytesLenth, 0);
BytesContent = br.ReadBytes(lenth - 2);
string conContent = Encoding.Default.GetString(BytesContent);
//conContent就是接受到的数据
}
catch (Exception ex)
{
Debug.Log("<color=#FF4500>处理接收的服务端数据出错:SendHearbeat</color>" + ex.ToString());
}
}
}
复制代码
欢迎光临 纳金网 (http://go.narkii.com/club/)
Powered by Discuz! X2.5