服务端创建,如下代码可实现创建TCP服务端,可发送并接受来自客户端的消息,仅能支持一个客户端。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Text;
public class socketServer : MonoBehaviour
{
Thread connectThread; //当前服务端监听子线程
public string address; //当前地址
public int port=8888;
TcpClient remoteClient; //远程客户端
// Use this for initialization
void Start()
{
connectThread = new Thread(InitServerSocket);
connectThread.Start();
}
// Update is called once per frame
void Update()
{
}
//severSocket方法创建
public void InitServerSocket()
{
int bufferSize = 8192; //缓存区大小
IPAddress ip = IPAddress.Parse("192.168.1.115");
//新建TCP链接,并开启子线程
TcpListener tcpListener = new TcpListener(ip, port);
tcpListener.Start();
Debug.Log("服务端---->客户端完成,并开启tcp链接监听");
//如有远程客户端链接,此时,得到的其对象,用于通讯
remoteClient = tcpListener.AcceptTcpClient();
Debug.Log("客户端链接开始,本地地址端口:" + remoteClient.Client.LocalEndPoint + "远程客户端端口:" + remoteClient.Client.RemoteEndPoint);
NetworkStream stream = remoteClient.GetStream();
do
{
try
{
byte[] buffer = new byte[bufferSize];
int byteRead = stream.Read(buffer, 0, bufferSize);
if (byteRead == 0)
{
Debug.Log("客户端断开");
break;
}
string msg = Encoding.Default.GetString(buffer, 0, byteRead);
Debug.Log("接收到的数据" + msg + "数据长度" + byteRead + "字节");
}
catch (System.Exception ex)
{
Debug.Log("客户端异常:" + ex.Message);
//客户端出现异常或者断开的时候,关闭线程,防止溢出
tcpListener.Stop();
break;
}
} while (true);
}
public void SendMessageToClient()
{
if (remoteClient != null)
{
remoteClient.Client.Send(Encoding.UTF8.GetBytes("MovieSelect|1.wmv#"));
}
}
/// <summary>e
/// 销毁时关闭监听线程及连接
/// </summary>
void OnDestroy()
{
if (remoteClient != null)
remoteClient.Close();
if (connectThread != null)
connectThread.Abort();
}
}
客户端的创建,如下代码可实现tcp客户端的创建,可发送并接受来自服务器的消息,支持Hex数据格式。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System.Text;
using UnityEngine.UI;
using System.Threading;
public class sockets : MonoBehaviour
{
private IPAddress serverIP;
private Socket Client;
private bool connectState = false;
private byte[] receiveData = new byte[1024];
private string receiveMessage;
private Thread reThread;
void Start()
{
reConnect();
}
void Update()
{
Debug.Log(Client.Connected);
}
//链接服务器
void reConnect()
{
serverIP = IPAddress.Parse("127.0.0.1");
Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Client.Connect(serverIP,8885);
reThread = new Thread(ReceiveMessage);
reThread.Start();
//ReceiveMessage();
}
//接受服务器的消息
void ReceiveMessage()
{
bool flag = true;
while (flag)
{
if (Client.Connected == false)
flag=!flag;
int length = Client.Receive(receiveData);
receiveMessage = Encoding.Default.GetString(receiveData,0, length);
Debug.Log("Recieve Message is "+receiveMessage);
}
}
public void sendMsg()
{
try
{
//定义要传送的信息 字符串
//string message = sendText.GetComponent<Text>().text;
string message = "要发送的字符串";
byte[] data = Encoding.Default.GetBytes(message);
Client.Send(data, 0, data.Length, SocketFlags.None);
Debug.Log("send successfull");
}
catch (System.Exception ex)
{
Debug.Log("sendStringError"+ex);
}
}
public void sendHexMsg()
{
try
{
//定义要传送的信息16进制
byte[] buffer = { 0x23, 0x56, 0xFE, 0x39 };
//byte[] data = Encoding.Default.GetBytes(message);
//myClientsocket.Send(buffer, 0, buffer.Length, SocketFlags.None);
Client.Send(buffer, buffer.Length, 0);
Debug.Log("send successfull");
}
catch (System.Exception ex)
{
Debug.Log("sendHexError"+ex);
}
}
public void shutDownThread()
{
reThread.Abort();
}
}