用Sockets接收和转换数字和字符串数据
2008-04-24 09:41
330 查看
多时候远程系统在执行并发任务的时候,会把它接收到数据的长度以数字的形式发送出去。但用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;
}
使用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;
}
相关文章推荐
- 用Sockets接收和转换数字和字符串数据
- js中常用数据类型之间转换--字符串转换成数字;----字符串和json;---字符串和数组
- C# 的数据类型转换 c#字符串转换格式 c#日期数字字符串整形格式转换
- Oracle数据删除恢复和数字与字符串之间的转换
- C# 控制台输入输出非字符串类型数据的方法[进制数字转换为八进制数字]
- python 基础-----数字,字符串,if while 循环 数据类型的转换简单介绍
- 数字类型、字符串类型常用转换,数据精度问题解决
- 将整形数据转换为反转数字字符串输出
- js数据类型中的数字与字符串的转换
- 在Shell脚本中编写AWK脚本实现数据提取—注意格式、awk中使用shell变量、awk中数字字符串转换成数字、awk中字符串相等比较
- PHP数据类型转换(字符串转数字,数字转字符串)
- 将字符串转换为数字
- 库函数之字符串与数字间的转换
- C++中数字与字符串之间的转换
- 如何将十六进制字符串转换为数字
- MCU接收串口字符型数据转换成数据型数据
- python基本数据类型,数字与字符串
- C 这个字符串参数必须包含一个或者多个数字,函数应该把这些数字字符转换为整数并返回这个整数。如果字符串参数包含了任何非数字字符,函数就返回零。
- ip地址在数字与字符串之间的相互转换
- 对于给定的一个字符串,统计其中数字字符出现的次数。输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。