| 订阅 | 在线投稿
分享
 
 
 

用Socket接收和转换数字和字符串数据

来源:互联网网民  宽屏版  评论
2006-01-09 00:20:45

很多时候远程系统在执行并发任务的时候,会把它接收到数据的长度以数字的形式发送出去。但用socket发送和接收数字型数据的时候,要考虑到一个问题:要根据网络另一端机器的类型转换数据。尤其需要知道怎样把要发送的数据格式(网络格式)从本地机器的格式(主机格式)转换成为行业标准格式。

使用IPAddress.NetworkToHostOrder可以把数据从网络规则转换为主机格式,下面的ReceiveHeader函数说明了它的用法,ReceiveHeader函数实现过程如下:

1 用Socket.Receive从远程机器接收数据。

2 验证接收到的字节数是4。

3 Socket.Receive返回一个字节型数组,BitConvert.ToInt32把它转换成数字型数值。

4 最后,IPAddress.NetworkToHostOrder把长数值转换为主机格式。

public int ReceiveHeader(Socket socket)

{

int dataSize = -1; // error

byte [] buffer = new byte[4];

int bytesRead = socket.Receive(buffer, 4,

System.Net.Sockets.SocketFlags.None);

if (4 == bytesRead)

{

dataSize = BitConverter.ToInt32(buffer, 0);

dataSize = IPAddress.NetworkToHostOrder(dataSize);

}

else // error condition

return dataSize;

}

下面再来看一下怎样用多线程读取的方法为每个字符串都建立连接,从远程机器接收字符串型数据。在这种情况下,要把字节型数据转换成String型对象。你可以根据需要用ASCIIEncoding或UnicodeEncoding类进行转换。ReceiveDetail函数按以下步骤实现(此函数必须在ReceiveHeader后调用,因为datasize的值是从ReceiveHeader中得到的。)

1 在while循环中调用Socket.Receive,直到无返回值为止。数据被读入一个字节型数组。

2 建立一个ASCIIEncoding对象。

3 调用ASCIIEncoding.GetString把字节型数组转换成String对象,然后把它和先前读入的数据连接。

public string ReceiveDetail(Socket socket, byte[] buffer,

int dataSize)

{

string response = "";

int bytesReceived = 0;

int totalBytesReceived = 0;

while (0 < (bytesReceived =

socket.Receive(buffer, (dataSize - totalBytesReceived),

SocketFlags.None)))

{

totalBytesReceived += bytesReceived;

ASCIIEncoding encoding = new ASCIIEncoding();

response += encoding.GetString(buffer, 0, bytesReceived);

}

return response;

}

 
特别声明:以上内容(如有图片或视频亦包括在内)为网络用户发布,本站仅提供信息存储服务。
 
很多时候远程系统在执行并发任务的时候,会把它接收到数据的长度以数字的形式发送出去。但用socket发送和接收数字型数据的时候,要考虑到一个问题:要根据网络另一端机器的类型转换数据。尤其需要知道怎样把要发送的数据格式(网络格式)从本地机器的格式(主机格式)转换成为行业标准格式。 使用IPAddress.NetworkToHostOrder可以把数据从网络规则转换为主机格式,下面的ReceiveHeader函数说明了它的用法,ReceiveHeader函数实现过程如下: 1 用Socket.Receive从远程机器接收数据。 2 验证接收到的字节数是4。 3 Socket.Receive返回一个字节型数组,BitConvert.ToInt32把它转换成数字型数值。 4 最后,IPAddress.NetworkToHostOrder把长数值转换为主机格式。 public int ReceiveHeader(Socket socket) { int dataSize = -1; // error byte [] buffer = new byte[4]; int bytesRead = socket.Receive(buffer, 4, System.Net.Sockets.SocketFlags.None); if (4 == bytesRead) { dataSize = BitConverter.ToInt32(buffer, 0); dataSize = IPAddress.NetworkToHostOrder(dataSize); } else // error condition return dataSize; } 下面再来看一下怎样用多线程读取的方法为每个字符串都建立连接,从远程机器接收字符串型数据。在这种情况下,要把字节型数据转换成String型对象。你可以根据需要用ASCIIEncoding或UnicodeEncoding类进行转换。ReceiveDetail函数按以下步骤实现(此函数必须在ReceiveHeader后调用,因为datasize的值是从ReceiveHeader中得到的。) 1 在while循环中调用Socket.Receive,直到无返回值为止。数据被读入一个字节型数组。 2 建立一个ASCIIEncoding对象。 3 调用ASCIIEncoding.GetString把字节型数组转换成String对象,然后把它和先前读入的数据连接。 public string ReceiveDetail(Socket socket, byte[] buffer, int dataSize) { string response = ""; int bytesReceived = 0; int totalBytesReceived = 0; while (0 < (bytesReceived = socket.Receive(buffer, (dataSize - totalBytesReceived), SocketFlags.None))) { totalBytesReceived += bytesReceived; ASCIIEncoding encoding = new ASCIIEncoding(); response += encoding.GetString(buffer, 0, bytesReceived); } return response; }
󰈣󰈤
 
 
 
>>返回首页<<
 
 热帖排行
 
 
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
©2005- 王朝网络 版权所有