在上一篇文章中,简单的封装了一下服务端中相关的socket对象,为了可以更方便的使用。所以在本篇中,进一步封装一下在unity中的相关客户端类
封装客户端类,首先采用单例模式,然后采用两个队列来存储我们相关的收发信息
private static NetManager instance;
public static NetManager Instance => instance;
private Socket socket;//客户端socket
private Queue<string> receiveQue = new Queue<string>();//接收队列,子线程放,主线程拿取
private Queue<string> sendQue = new Queue<string>();//发送队列,主线程放,子线程拿取并发送
private bool isConnteced;
private int num;//接收信息字节大小
private byte[] reveiveBuffer = new byte[1024 * 5];
连接函数
public void Connect(string ip, int port)
{
if (socket is null)
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse(ip), port);
try
{
socket.Connect(ipPoint);
isConnteced = true;
ThreadPool.QueueUserWorkItem(SendMsg);
ThreadPool.QueueUserWorkItem(ReceiveMsg);
}
catch (SocketException s)
{
if (s.ErrorCode == 10061)
print("服务器拒绝连接");
else
print("连接出错 " + s.ErrorCode);
return;
}
}
处理信息发送和接收
public void Send(string info)
{
sendQue.Enqueue(info);
}
public void Receive()
{
if (receiveQue.Count > 0)
{
print(receiveQue.Dequeue());
}
}
发送消息时,主线程只用把信息存进发送队列里就行,子线程负责从队列中取出信息进行发送
接收消息时,子线程负责对发送过来的字节流进行处理,将处理完毕后的信息存储接收队列里,主线程只需要不断的读取队列里的信息就行
private void SendMsg(object obj)
{
if (socket is null) return;
while(isConnteced)
{
if (sendQue.Count > 0)
{
socket.Send(Encoding.UTF8.GetBytes(sendQue.Dequeue()));
}
}
}
private void ReceiveMsg(object obj)
{
if (socket is null) return;
while(isConnteced)
{
if (socket.Available > 0)
{
num = socket.Receive(reveiveBuffer);
receiveQue.Enqueue(Encoding.UTF8.GetString(reveiveBuffer, 0, num));
}
}
}
扫描二维码关注公众号,回复:
17499078 查看本文章
使用就很简单了,在unity中新建一个脚本,调用一下Connect方法就可以进行连接了
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Main : MonoBehaviour
{
void Start()
{
if (NetManager.Instance is null)
{
GameObject game = new GameObject();
game.AddComponent<NetManager>();
}
NetManager.Instance.Connect("127.0.0.1", 8080);
}
}
新建一个ui画布,添加一个输入框,一个按钮,按钮绑定一下send方法就可以进行简单输入信息并发送了
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Input : MonoBehaviour
{
public Button button;
public InputField inputField;
private void Start()
{
button.onClick.AddListener(() =>
{
if (inputField.text != null)
{
NetManager.Instance.Send(inputField.text);
}
});
}
}
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
public class NetManager : MonoBehaviour
{
private static NetManager instance;
public static NetManager Instance => instance;
private Socket socket;//客户端socket
private Queue<string> receiveQue = new Queue<string>();//接收队列,子线程放,主线程拿取
private Queue<string> sendQue = new Queue<string>();//发送队列,主线程放,子线程拿取并发送
private bool isConnteced;
private int num;//接收信息字节大小
private byte[] reveiveBuffer = new byte[1024 * 5];
private void Awake()
{
instance = this;
}
private void Update()
{
Receive();
}
public void Connect(string ip, int port)
{
if (socket is null)
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse(ip), port);
try
{
socket.Connect(ipPoint);
isConnteced = true;
ThreadPool.QueueUserWorkItem(SendMsg);
ThreadPool.QueueUserWorkItem(ReceiveMsg);
}
catch (SocketException s)
{
if (s.ErrorCode == 10061)
print("服务器拒绝连接");
else
print("连接出错 " + s.ErrorCode);
return;
}
}
public void Send(string info)
{
sendQue.Enqueue(info);
}
public void Receive()
{
if (receiveQue.Count > 0)
{
print(receiveQue.Dequeue());
}
}
public void Close()
{
if (socket != null)
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
socket = null;
}
}
private void SendMsg(object obj)
{
if (socket is null) return;
while(isConnteced)
{
if (sendQue.Count > 0)
{
socket.Send(Encoding.UTF8.GetBytes(sendQue.Dequeue()));
}
}
}
private void ReceiveMsg(object obj)
{
if (socket is null) return;
while(isConnteced)
{
if (socket.Available > 0)
{
num = socket.Receive(reveiveBuffer);
receiveQue.Enqueue(Encoding.UTF8.GetString(reveiveBuffer, 0, num));
}
}
}
}