请问,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
------解决方案--------------------
------解决方案--------------------receive是被动的接收对方发送过来的数据,不是主动去对方取的,存储收到的数据需要一个字节数组,数组的定义是必须要指定大小的,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之类的追加后面接收的数据。