socket为什么无法传输大文件
‘壹’ 请教socket文件传输问题
关闭?Receive最好开辟一个线程,来不断循环不断侦听每次发来的数据,你的Send传递的数据如果为二进制,最好分成两次传递,第一次传递二进制数据的长度,第二次传递数据,Receive接收的第一次数据得到二进制数据长度后,定义字节数组的长度,第二次向字节数组传递数据!你不是关闭,你是不是将传递与接收写在一起了?
‘贰’ 用SOCKET写文件传输遇到问题
1、跟双核没有关系。
2、你new的没有释放
3、事件怎么定义和使用的,是否是全局的?如果是要定义成静态的。
4、怀疑你读取文件没有移动文件指针。
5、至于200K文件传输没有问题,弹出错误是在处理内存时出错。
‘叁’ SOCKET 传输大文件应该怎么做
昨天有去做测试,发现,并不是IO的问题造成整体的传输慢!还会代码存在问题
我按照自己3的思路去完成代码,也就是在Server端,我分了两个线程,一个线程用于读取文件,并将读到的buf加入到一个动态链表尾部,另一个线程从此链表头取数据,进行send操作,并且对send的返回值进行校验,如果send的返回值和预期的发送字节数不同,则采用断点重传的方式,继续传输。在Client端口,也是用类似的服务端的机制,维护一个链表,进行读取。
需要说明的是:我维护的这个链表是由深度的,并通过深度来调节两个线程对链表的操作。
‘肆’ 请教关于socket传输大文件的思路
这要考虑到文件I/O的效率和传输的速率的问题。
关于I/O效率:buffer的值对I/O效率有很大影响,一般而言buffer缓冲区大小设置为1024 2048 或者4096会得到最佳速率。
关于传输:这个和你的带宽和网络状况有关了,带宽越大,网络状况越好自然传输速度就快。
至于编码,你多线程传输跟单线程传输效率基本上差不多。跟普通文件一样的方式传输就行。
如有不同意见的朋友请指教!谢谢!
‘伍’ java中,利用socket传送大文件,中途停止问题
thread里面接收数据应该是一个循环把?
那么就给这个循环加一个跳出条件,比如说
private boolean stop=true;
在循环当中增加
if(stop=false){
break;
}
public void setStop(boolean stop)
{
this.stop=stop;
}
然后在需要停的时候调用setStop(false)就可以了
上面纯手打,代码拼写什么的可能有错大概就是这个意思
顺便说一下,thread.interrupt()是用来防止sleep或者wait方法卡死的,不会让线程终结。你要让线程结束还是要手动让程序跳出循环
‘陆’ c语言socket文件传输问题
服务器端(发送文件):首先打开文件【fopen】,用rb方式打开,既可以发送文本文件,也可以发送二进制文件,在无错时初始化套接字socket,即初始化socket库【WSAStartup】,分配socket【socket】,填充服务器的地址,即填充sockaddr_in结构,然后进行绑定【bind】,设置套接字为监听套接字【listen】,接收连接【accept】,至此服务器阻塞,等待客户端的连接。
客户端(接收文件):首先打开文件【fopen】,用wb方式打开,在无错时初始化套接字socket,即初始化socket库【WSAStartup】,分配socket【socket】,填充客户端的地址,即填充sockaddr_in结构,然后进行绑定【bind】,再填充服务器的地址结构,然后调用【connect】进行连接,当连接成功后,第一阶段的工作便结束了。
第二阶段,发送文件。
服务器端:使用循环while,结束条件是(!feof(fp)),fp是文件指针,feof检测当前的文件读取指针是否到达文件尾部,若到达了就返回真,否则返回假。然后在循环内部依次调用【fread】、【send】进行发送。这里有一个问题需要注意,调用fread的时候有两个参数是要每次读多少字节和读多少次,将第一个设置为1,将第二个设置为缓冲区的大小,用一个变量记录实际读到多少字节,即【fread】的返回值,然后将其传递给【send】,就可以实现发送文件了,在发送完成后断开连接【closesocket】,关闭文件【fclose】。
客户端:使用while死循环,调用【recv】接收文件,【fwrite】写入文件,这里也有个和上面类似的问题,就是要将recv的返回值传递给fwrite的第三个参数,即受到了多少字节,就向文件中写多少字节。当recv返回值为0时(连接断开时)退出循环,【closesocket】关闭套接字,调用【fclose】关闭文件。
‘柒’ socket 大文件如何发送
大文件的发送可以把大文件按照二进制byte[]的方式读取 设定一次发送的最大字节数 然后根据最大发送字节数分割成N个等分可能最后一个N的字节数小于最大发送字节数 解决方法是后面补填0就可以了因为发送时间可能会很长 因此用TCP 协议 保证传输的完整性 另外你可以自己编写协议(每次发送之前做一次校验 接收方校验通过就通知发送方发送下一个包就可以了) 做实验的话校验部分就可有可无
‘捌’ 用java socket传输多文件遇到的问题
我觉得应该是你在服务器端的接收之后存储的缓存是不是太小了 当你的文件大于这个缓存的最大容量时 就会抛出异常 程序虽然没有停止 但是那个监听端口就会被关闭掉
‘玖’ socket(C#)实现把文件从客户端传向服务器端时,为什么每次都只能传2KB大小的文件啊
发送的时候要用while循环,直到整个文件传完收的时候也是,用while循环到收完 因为发是一段一段发的,发一段,收完再发一段,再收完再发一段
‘拾’ 在socket 编程时如果客户端发给服务器端的数据太大,一次性不能传送完,要怎么办
数据太大的话一般都会分包发送,TCP和UDP包都有最大的上限。如果服务器端收不到就不会执行的话要用TCP协议。
传输层:
对于UDP协议来说,整个包的最大长度为65535,其中包头长度是65535-20=65515;
对于TCP协议来说,整个包的最大长度是由最大传输大小(MSS,Maxitum Segment Size)决定,MSS就是TCP数据包每次能够传
输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需
要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小值
确定为这次连接的最大MSS值。
IP层:
对于IP协议来说,IP包的大小由MTU决定(IP数据包长度就是MTU-28(包头长度)。 MTU值越大,封包就越大,理论上可增加传送速率,但
MTU值又不能设得太大,因为封包太大,传送时出现错误的机会大增。一般默认的设置,PPPoE连接的最高MTU值是1492, 而以太网
(Ethernet)的最高MTU值则是1500,而在Internet上,默认的MTU大小是576字节