.net 与android的跨平台tcp网络通信的字节处理

.net 与android的跨平台tcp网络通信的字节处理,第1张

概述更详细内容,请参考[配置啦]: .net与android的跨平台tcp网络通信字节处理(大端序,小端序),含代码示例原文链接:http://config.net.cn/opensource/dataformat/fb5e2671-cfc5-415b-9028-960780c37774-p1.htmlA.)主业务流程顺序.1.)梳理两端的通讯协议,发送方的封包和接收方的解

更详细内容,请参考[配置啦]: .net与android的跨平台tcp网络通信中字节处理(大端序,小端序), 含代码示例

原文链接:http://config.net.cn/opensource/dataformat/fb5e2671-cfc5-415b-9028-960780c37774-p1.html

A.)主业务流程顺序.

1.)梳理两端的通讯协议,发送方的封包和接收方的解包是一个对称的过程,另外如果跨语言,跨平台还需要考虑字节的大端序,小端序等.

2.)考虑以哪一方作为服务端.//需要考虑是否需要端口映射,客户端有多少个连接等.

B.)应用案例.

B1.)关于一个跨平台TCP通信的应用:androID插件与pc的调用.

1.)启动androID(server端)的监听服务.

2.)pc端(clIEnt)进行端口映射.//端口映射之前,确保对方有监听的服务,否则没有意义.

3.) pc端(clIEnt)进行连接服务端.

4.) androID端可以发送.

C.)关于对象的创建及维持.

1)c#端的对象的使用.

:无论是读还是写,如果想重用当前的Tcpsocket连接,则这个Networkstream对象不能执行.close,.dispose,或者在using中执行...因为实践发现stream关闭后对应的socket连接也会关闭...造成网络的另一端断开连接,抛异常..

[注]保持socket连接,适用于比如(pc与androID设备一一对应),不会出现连接数太多导致连接数不够的问题.如果连接数太多,则需要每次都进行创建和维持.

2)c#读取tcp网络字节的格式:

NetworkStream stream = null;

try

{

stream = this.GetClIEntStream();//从TcpClIEnt中获取流.

while (this.IsConnected() && stream != null && (iTotalRecv < iNeedRecvLen))

{

if (stream.DataAvailable == false)  //没有可读数据就等待

{

continue;

}

if (this.IsConnected() && stream != null && stream.CanRead)//socket处于连接状态,且流可读

{

iRead = 0;

iRead = stream.Read(buffer, iTotalRecv, iNeedRecvLen - iTotalRecv);

if (iRead <= 0)

{

break;

}

iTotalRecv += iRead;

}

}

}

D.)细节注意点.

1.)需要注意,c#端在端口映射时,只管pc端的端口自己控制,手机端的端口需要手机中的服务自行定义并约定.

2.)androID插件涉及相关的服务的androIDmanifest.xml中的生命,及相关的网络,本地存储等权限生命都是必须的.

3.)需要考虑手机端插件内部监听的端口不一致的问题,比如万一一个手机上的我们约定的端口被其它APP占用,则应该想办法给结束掉.如果是不一致的,则需要想办法进行通知pc端.

4.)再次强调,服务端和客户端tcp处理的封包,解包的对称性,不可盲目各写各的.

5.)就byte来说各平台的接收处理都是一样的,只是在涉及(字节int或long类型的包长)的转换方面,各个平台语言是不一样的,很容易出现包场紊乱进而导致粘包,丢包或无法收包等问题.

//c#发送给java包的长度

///

/// 写入大端序的long

///

///

private byte[] LongToBytes(long lLength)

{

//方案1:跨平台语言(测试通过)

//byte[] bs = BitConverter.GetBytes(lLength);

//Array.Reverse(bs);

//return bs;

//方案2:跨平台语言(测试通过)

return BitConverter.GetBytes(IPAddress.HostToNetworkOrder((long)lLength));

}

 

//java从c#哪里接收包的长度

private long GetBytesFromLong(byte [] bytes){

ByteBuffer buffer = ByteBuffer.allocate(8);

buffer.put(bytes, 0, bytes.length);

buffer.flip();

return buffer.getLong();

}

[注]节序,又称端序,尾序,英文:Endianness。

在计算机科学领域中,字节序是指存放多字节数据的字节(byte)的顺序,典型的情况是整数在内存中的存放方式和网络传输的传输顺序。Endianness有时候也可以用指位序(bit)。

大小端序跟硬件的体系结构有关,所有x86系列的pc机都是小端序,跟 *** 作系统无关。在x86系列的pc上的solaris系统是小端序,sun sparc平台的solaris是大端序。

大端字节序,高字节存于内存低地址,低字节存于内存高地址;小端字节序反之.

E)关于稳定性.

1.)对于(pc-手机)这个一一对应的组合内通信,保持一个连接即可,可以通过单例模式实现.

2.)如果遇到上述组合的通信失败,可以调用tcp重连进行处理.

总结

以上是内存溢出为你收集整理的.net 与android的跨平台tcp网络通信的字节处理全部内容,希望文章能够帮你解决.net 与android的跨平台tcp网络通信的字节处理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1034591.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存