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

原创 2004年04月28日 00:06:00
多时候远程系统在执行并发任务的时候,会把它接收到数据的长度以数字的形式发送出去。但用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;
}

字符串和数字之间的相互转换总结

最近刷题有用到字符串和整形数字之间的转化,特地总结一下。 int本身也要用一串字符表示,前后没有双引号,告诉编译器把它当作一个数解释。缺省情况下,是当成10进制(dec)来解释,如果想用8进制,...
  • JIEJINQUANIL
  • JIEJINQUANIL
  • 2016年08月18日 23:30
  • 2578

C++中字符串和数字之间的转换

atof(将字符串转换成浮点型数) atoi(将字符串转换成整型数) atol(将字符串转换成长整型数) strtod(将字符串转换成浮点数) strtol(将字符串转换成长整型数) str...
  • qq_31917799
  • qq_31917799
  • 2016年11月02日 23:07
  • 1401

perl中的字符串和数值

$string = "11"; $number = 22; $result = $string + $number; # $result = 33 perl 中字符串和数值可以互相转换,但是...
  • caz28
  • caz28
  • 2012年07月27日 10:17
  • 3150

MATLAB 读取txt含有字符串和数字的数据

datatable = importdata('at201701_argoinv.txt'); %加载txt数据 data = datatable.data; %读取非元胞的数据,data,是其...
  • miao0967020148
  • miao0967020148
  • 2017年04月26日 09:50
  • 2280

数字与字符串之间的转换

C语言为我们提供了数字和字符串之间的转换函数,这些函数有很多,常用的有: 整型数转字符串函数itoa(): char *itoa(int value,char *string,int radix)...
  • cyfcsd
  • cyfcsd
  • 2016年05月12日 11:09
  • 1829

接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。

题目描述 写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。 输入描述: 输入一个有字母和数字以及空格组成的字符串,和一个字...
  • oShuangLengChangHe12
  • oShuangLengChangHe12
  • 2017年10月27日 21:56
  • 326

IP地址转换:数字与字符串之间的转换

IPv4 4字节 MSB————–LSB BYTE4 BYTE3 BYTE2 BYTE1每个字节表示的范围: BYTE4: 4294967296(2*32*) BYTE3: 16777...
  • lanyang123456
  • lanyang123456
  • 2017年03月12日 21:58
  • 1285

字符串/数字之间类型转换总结

1、char向int转换 方法一:(适用于单个字符) char ch = '6'; int num = ch - '0';   //此时num=6 方法二:(适用于字符串) 函数atoi: int a...
  • xyw_Eliot
  • xyw_Eliot
  • 2014年05月12日 15:45
  • 1995

字符串和数字之间的转换函数(glibc)

atof(将字符串转换成浮点型数)  相关函数  atoi,atol,strtod,strtol,strtoul 表头文件  #include 定义函数  double atof(const char...
  • szwpc
  • szwpc
  • 2005年11月27日 21:49
  • 1779

JavaScript中关于parseInt(),Number(),parseFloat()以及一元运算符“+”将字符串类型转换为数字类型的对比

昨天看到了JS中基本类型互相转换的一些内容,遇到了pareInt()和Number()两种方式,感觉以前只是应用但是对其没有一个系统的了解,去网上大致了解了一下,自己总结了一下: parseInt()...
  • kirinlau
  • kirinlau
  • 2017年04月18日 11:16
  • 909
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用Sockets接收和转换数字和字符串数据
举报原因:
原因补充:

(最多只允许输入30个字)