更详细内容,请参考[配置啦]: .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网络通信的字节处理所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)