日期:2014-05-18  浏览次数:20958 次

请问,Socket编程,接收数据
服务器端代码:


IPAdress ip=IPAdress.Prase("服务器IP 地址"); 
IPEndPoint iep=new IPEndPoint (ip, 可用端口号);  
Socket socket=new Socket(AdressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
socket.Bind(iep); //绑定套接字
socket. Listen(最大客户端连接数); //监听
Socket clientSocket=socket.Accept(); //接受连接
string message = "发送的数据";  
byte[] sendbytes = System.Text.Encoding.UTF8 .GetBytes(message); //要先将要发送的数据转换为字节数组
int successSendBytes = clientSocket.Send( sendbytes , sendbytes.Length , SocketFlags.None );  

… 
byte [] receivebyte s = new byte [1024 ]; //这个1024是什么意思
int successReceiveBytes = clientSocket.Receive(receivebytes ); //接收数据


我想问的是Receive (Byte[])方法:http://msdn.microsoft.com/zh-cn/library/8s4y8aff.aspx
MSDN的解释是:Receive方法的参数是Byte 类型的数组,它是存储接收到的数据的位置。

既然是存储接收到的数据的位置,那就应该去那个位置取数据啊,怎么new一个byte[]数组呢?
new一个byte[]数组,那1024又是啥意思呢?


------解决方案--------------------
1024是数组容量,接收这么多字节
------解决方案--------------------
int successReceiveBytes = clientSocket.Receive(receivebytes ); //接收数据

1024是准备接受那么多数据,successReceiveBytes 是实际接受这么多的数据
------解决方案--------------------
接收1024个byte
------解决方案--------------------
探讨

int successReceiveBytes = clientSocket.Receive(receivebytes ); //接收数据

1024是准备接受那么多数据,successReceiveBytes 是实际接受这么多的数据

------解决方案--------------------
receive是被动的接收对方发送过来的数据,不是主动去对方取的,存储收到的数据需要一个字节数组,数组的定义是必须要指定大小的,1024只是一个最大的接收容量,可以改成任何值——只要不小于收到的数据的字节数
------解决方案--------------------
探讨
引用:

1024是数组容量,接收这么多字节

只接收这么多个字节?既然是接收远程的数据,通常情况下应该是全部接收吧,为什么要限制呢?如果1024个字节满了,数据还没有接收完,岂不是漏掉了一些数据吗?

------解决方案--------------------
我感觉吧 最好是动态添加 最好不要在最开始初始化数组大小
------解决方案--------------------
看下协议去吧
TCP是流式套接字,一次接受不完的话,可以继续接收
但UDP就不一样了,收不完就丢了,一个UDP包长好像是1420吧,包头忘记了。具体可以根据你要传的数据来定义接收缓存的大小。
------解决方案--------------------
byte [] receivebyte s = new byte [1024 ]; //这个1024是什么意思
==>看来基础知识没掌握。[]是数组的定义。定义数据时指定数据大小1024。
receivebyte表示数组的起始位置。

Receive (Byte[])方法
方法用到的参数是通过receivebyte 变量传递数据的。
Receive 从receivebyte的起始位置读取数据。读到的数据长度(小于等于1024)保存到int successReceiveBytes变量中。
------解决方案--------------------
Receive 的意思是接收数据,需要你先弄好一个数组(new byte[1024]),然后把这个数组传递进去,Receive函数会把接收到的数据填充到你给它的数组,如果缓存中的数据比你给的数组长度小,则有多少填充多少,如果比你给的数组还多,则把你的数组填满为止.
------解决方案--------------------

就是先画一亩田,1024就可以理解成这一亩...抛开语法不谈,如果不new那以就只能画一平方米的地给你,这么小的地你愿意得到不?

在阻止模式,发送和接收都可以用这一亩田里来进行,你可以在这一亩田之内:
种小白菜,种完收获,再种大白菜。

在非阻止模式下,你还要再拿一亩的地出来。将小白菜和大白菜分开来种。
------解决方案--------------------


1、不是,receive一次,二次都是同一个,不用再别外new。

2、receive只是临时用来接收一部份数据。用来存储全部的数据可以使用StringBuilder之类的追加后面接收的数据。