client的实现:
public class socket_management : MonoBehaviour
{
private TcpClient tcpClient_ = new TcpClient();
public socket_management()
{
}
///
/// 建立 Connect Server.
///
public void Init()
{
tcpClient_.NoDelay = true; //关闭Nagle演算法,这个算法是之前网路不发达的时候才需要的
//初始化callback
AsyncCallback connect_callback = null;
// 实现callback,这个函数会在connect之後被调用;
connect_callback = ar =>
{
tcpClient_.EndConnect(ar);//异步调用的时候需要的;
if (tcpClient_.Connected)//判断是否连接成功;
{
NetworkStream networkStream_connect = tcpClient_.GetStream();//初始化数据流
byte[] tempRecvBuffer = new byte[1024];
if (networkStream_connect.CanRead)
{
//读取数据;
//第4个参数是回调函数,也就是有读到数据的时候,会被调用;
//最後一个参数是用来存储数据,看下面的endReadCallback函数的参数,是IAsyncResult类型,这个可以用来存取读到的数据,数据格式是在这个参数自定义的:new了一个object数组,这个object数组只有一个元素,用来接受数据的byte[],使用的时候,可以放入自定义的class structure 等,但是读取的时候要注意排序;
networkStream_connect.BeginRead(tempRecvBuffer, 0, 1024, new AsyncCallback(endReadCallback), new object[] { tempRecvBuffer });
}
if (networkStream_connect.CanWrite)
{
//发送数据
byte[] buffer = Encoding.UTF8.GetBytes("hello Server");
Debug.Log("send msg" + buffer.Length);
networkStream_connect.BeginWrite(buffer, 0, buffer.Length, new AsyncCallback(endWriteCallback), null);
}
}
};
tcpClient_.BeginConnect(IPAddress.Parse("127.0.0.1"), 7001, new AsyncCallback(connect_callback), tcpClient_);
Debug.Log("Init : connect to server");
}
...
}
读的回调函数:
private void endReadCallback(IAsyncResult ar)
{
NetworkStream networkStream = tcpClient_.GetStream();
int packetLength = networkStream.EndRead(ar);
if (packetLength > 0)
{
Debug.Log("get a msg " + packetLength);
//获取读到的数据
object[] objArr = (object[])ar.AsyncState;
//因爲数组的0个元素是要读的buffer
byte[] recvBuffer = (byte[])objArr[0];
Array.Resize(ref recvBuffer, packetLength);
//transform to string and print,转换成string类型,并进行打印
string result = System.Text.Encoding.UTF8.GetString(recvBuffer);
Debug.Log(result);
//这一步一定要写,才会继续读下去
networkStream.BeginRead(recvBuffer, 0, recvBuffer.Length, new AsyncCallback(endReadCallback), new object[] { recvBuffer });
}
}
写回调函数:
private void endWriteCallback(IAsyncResult ar)
{
NetworkStream networkStream = tcpClient_.GetStream();
networkStream.EndWrite(ar);
}
效果演示:
用visual studio2019写的c++server,收到什麽数据,就会回复什麽数据:
用unity和vscode写的c#中client端,连上之後,会发一个'hello server',然後把收到的数据打印出来:
<<: Vue 如何在 LocalHost 开发环境时使用 HTTPS
>>: 透过 Composer 安装、更新、移除 PHP 套件或框架(PHP, Composer套件管理)
Hi~大家好,我今天想要分享的实作包括如下: < Azure Function > 1....
证书申请和回应 证书签名请求(Certificate Signing Request) 在公钥基础结...
大家好,我是毛毛。ヾ(´∀ ˋ)ノ 废话不多说开始今天的解题Day~ 520. Detect Cap...
结构 主要可以分为四个部分「state」、「getters」、「mutation」、「actions...
今天来继续看事件检视器,笔者挑一些自己笔电常出现的警告来分享,最近发现我的电脑似乎还算健康没什麽大问...