VB SOCKET 实现文件传输
android中使用WebSocket传递数据

android中使用WebSocket传递数据WebSocket是一种在Web浏览器和服务器之间进行双向通信的协议,允许实时更新数据而无需重新加载页面。
在Android中,使用WebSocket可以方便地传输数据,并实现实时更新和通信。
1. 引入WebSocket库:要在Android应用程序中使用WebSocket,首先需要添加相应的库。
Android中常用的WebSocket库有OkHttp、Java-WebSocket等。
你可以通过在build.gradle文件中添加相应的依赖来引入这些库。
3. 设置WebSocket连接监听器:可以为WebSocket连接设置监听器,以便在连接状态发生变化时进行响应。
监听器通常包括onOpen、onMessage、onClose和onError等方法,用于处理打开、接收消息、关闭和错误事件。
你可以根据需要进行相应的处理。
4. 发送和接收消息:使用WebSocket可以发送和接收消息。
通过调用WebSocket对象的send方法可以发送消息给服务器,而接收到的消息通常通过监听器中的onMessage方法处理。
你可以根据消息的内容进行相应的操作。
注意,消息通常是以文本或二进制数据的形式进行传输。
5. 关闭WebSocket连接:当不再需要使用WebSocket连接时,应该关闭连接,以释放资源。
可以通过调用WebSocket对象的close方法来关闭连接。
在关闭连接前,可以释放一些资源或执行一些操作。
6. 错误处理:在使用WebSocket时,可能会发生一些错误,例如服务器无法连接、数据传输失败等等。
你可以在监听器的onError方法中处理这些错误情况,并根据实际需求进行相应的操作。
总的来说,使用WebSocket在Android中传递数据非常方便。
你可以通过简单的步骤创建WebSocket连接、设置监听器、发送和接收消息,并在需要时关闭连接。
这种方式可以实现实时更新和双向通信,非常适用于需要实时交互和数据更新的应用程序。
VB[1].NET通过Socket实现字符串发送与接收程序
![VB[1].NET通过Socket实现字符串发送与接收程序](https://img.taocdn.com/s3/m/5756b000a6c30c2259019e4f.png)
先查看MSDN帮助系统,找到socket类,有详细的创建套接字、使用套接字侦听、使用客户端套接字的说明。
打开 2003,新建一个工程,名称为Server。
在界面上添加一个列表框,两个按钮。
界面如图所示:我们使用多线程来实现先导入命名空间:Imports .socketsImports Imports System.TextImports System.Threading定义两个窗体变量Dim s As Socket = NothingDim t As Thread新建一个过程,用于处理接收到的Socket数据包Public Sub WaitData()s = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)'''使用TCP协议Dim localEndPoint As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 1024) '''指定IP和Ports.Bind(localEndPoint) '''绑定到该Sockets.Listen(100) '''侦听,考试#大提示最多接受100个连接While (True)Dim bytes(1024) As Byte '''用来存储接收到的字节Dim ss As Socket = s.Accept() '''若接收到,则创建一个新的Socket与之连接ss.Receive(bytes) '''接收数据,若用ss.send(Byte()),则发送数据ListBox1.Items.Insert(0, Encoding.Unicode.GetString(bytes))'''将其插入到列表框的第一项之前'''若使用Encoding.ASCII.GetString(bytes),则接收到的中文字符不能正常显示End WhileEnd Sub在BtnStart的click事件中,加入如下代码:t = New Thread(AddressOf WaitData) '''建立新的线程t.Start() '''启动线程BtnStart.Enabled = False '''按钮不可用,避免另启线程在BtnStop的click事件中,加入如下代码:Trys.Close() '''关闭Sockett.Abort() '''中止线程CatchFinallyBtnStart.Enabled = True '''启用BtnStartEnd Try为了防止用户不点击Stop直接退出,而不能使线程结束,则应在窗体的closing事件中,加入如下代码:Trys.Close()t.Abort()CatchEnd Try下面新建一个工程,名称为Client。
通过 Socket 发送和接收文件

这是一个简单的包含发送端和接收端的例子。
发送端向接收端发送文件名和文件内容,接收端将收到的文件保存在磁盘上。
接收端可以同时接收多个发送端传来的文件,但没有处理文件同名的情况。
这个例子中设计了一个简单的协议。
发送的内容是这样的:文件名长度(4字节)—文件名—文件内容长度(4字节)—文件内容。
接收端也按照这个结构进行解析。
建议先看Client 类,再看Server 类。
view plaincopy to clipboardprint?import java.io.*;import .ServerSocket;import .Socket;/*** 简单的文件发送与接收示例*/public class FileTrasmission {//程序入口public static void main(String[] args) throws Exception {int port = 7788;new Server(port, "c:\\save\\").start();new Client().sendFile("127.0.0.1", port, "c:\\迷失在康熙末年.txt");}}/*** 接收端。
可同时接收多个发送端发来的文件。
但如果发来的文件是同名的话那就乱了。
*/class Server {private int listenPort;private String savePath;/*** 构造方法** @param listenPort 侦听端口* @param savePath 接收的文件要保存的路径** @throws IOException 如果创建保存路径失败Server(int listenPort, String savePath) throws IOException { this.listenPort = listenPort;this.savePath = savePath;File file = new File(savePath);if (!file.exists() && !file.mkdirs()) {throw new IOException("无法创建文件夹" + savePath);}}// 开始侦听public void start() {new ListenThread().start();}// 网上抄来的,将字节转成int。
socket传输文件的原理

socket传输文件的原理
文件传输是计算机网络中的一项基本功能,它允许在网络上的不同计算机之间共享和传输文件。
Socket是实现文件传输的一种常用方式,其原理如下:
1. 建立连接:在进行文件传输之前,需要在发送方和接收方之间建立连接。
这通常通过TCP/IP 协议实现,使用Socket进行连接的建立。
一旦连接建立成功,发送方和接收方就可以通过该连接进行数据传输。
2. 文件分割:由于文件通常较大,不适合一次性传输,因此需要将文件分割成较小的数据块。
这些数据块可以按照一定的顺序进行编号,以便于接收方重新组合成完整的文件。
3. 发送数据:发送方通过Socket将分割好的数据块逐个发送给接收方。
在发送数据时,需要按照一定的协议进行数据的封装,例如添加文件名、数据块大小等信息。
4. 接收数据:接收方通过Socket接收到数据后,需要按照发送方的协议对数据进行解析和处理。
接收方会将收到的数据块进行缓存,以便后续重新组合成完整的文件。
5. 确认机制:为了确保文件传输的完整性和正确性,发送方和接收方之间需要建立一种确认机制。
例如,发送方可以发送一个数据包的编号给接收方,接收方在收到数据包后回复一个确认信号给发送方,表示该数据包已经成功接收。
如果发送方在一定时间内没有收到确认信号,则会重新发送数据包,以确保数据的可靠传输。
6. 关闭连接:当文件传输完成后,发送方和接收方之间的连接会被关闭。
这可以通过Socket 的关闭函数实现,释放网络资源。
通过以上步骤,使用Socket可以实现文件的传输。
在实际应用中,不同的文件传输协议可能会有一些差异,但基本原理是相同的。
C语言基于socket的文件传输(可循环发送多个文件)

C语⾔基于socket的⽂件传输(可循环发送多个⽂件)基本简介:本次⽂件传输的实现主要是通过客户端向服务器发送下载请求,然后在服务器中找到对应的⽂件并打开⽂件,再继续向客户端传送⽂件,⽽客户端就在不停的接收。
这是因为⽂件可能⽐较⼤,⼀个缓冲数组只能保存⼀部分⽂件内容,因此服务器得不断从⽂件中读取内容并发给客户端,⽽客户端得不停的循环接收。
但是在事先,得将相应要发送的⽂件(照⽚,⾳频,视频等)保存在服务器相应的⽬录下。
⽽这个是不符合实际要求的,通常来讲,是应该将客户端1的⽂件发送给客户端2,⽽服务器仅仅只是起到⼀个中转站的作⽤,即⽂件应该事先保存在客户端1下。
这⾥我们只是完成⽂件传输的相应功能就⾏了,就不在计较这些啦。
因为只要你理解了这⼀块,可以根据⾃⼰的实际需要,在进⾏修改。
具体编译:gcc server.c -o server -lpthread //这是因为在服务器中加⼊了线程函数,所以编译的时候需要加上 -lpthread 。
gcc client.c -o client记住⼀定要先运⾏服务器,在运⾏客户端。
在客户端运⾏的时候回提醒你输⼊服务器对应的pc ip,如实输⼊就⾏啦。
如果是在本机pc上进⾏测试的话,也可以输⼊0.0.0.0 。
server.c:#include <stdio.h>#include <netdb.h>#include <sys/socket.h>#include <arpa/inet.h>#include <sys/types.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <netinet/in.h>#include <pthread.h>#define portnum 12345#define FILE_SIZE 500#define BUFFER_SIZE 1024void *net_thread(void * fd);int main(){//初始化套接字int server_fd=socket(AF_INET,SOCK_STREAM,0);if(-1==server_fd){perror("socket");exit(1);}//绑定端⼝和ip;struct sockaddr_in server_addr; //struct sockaddr_in为结构体类型,server_addr为定义的结构体server_addr.sin_family=AF_INET; //Internet地址族=AF_INET(IPv4协议)server_addr.sin_port=htons(portnum); //将主机字节序转化为⽹络字节序 ,portnum是端⼝号(server_addr.sin_addr).s_addr=htonl(INADDR_ANY);//IP地址if(-1==bind(server_fd,(struct sockaddr *)&server_addr,sizeof(server_addr))) //套接字与端⼝绑定{perror("bind");exit(6);}//开启监听if(-1==listen(server_fd,5)) //5是最⼤连接数,指服务器最多连接5个⽤户if(-1==listen(server_fd,5)) //5是最⼤连接数,指服务器最多连接5个⽤户{perror("listen");exit(7);}while(1){struct sockaddr_in client_addr;int size=sizeof(client_addr);int new_fd=accept(server_fd,(struct sockaddr *)&client_addr,&size); //server_fd服务器的socket描述字,&client_addr指向struct sockaddr *的指针,&size指向协议地址if(-1==new_fd){perror("accept");continue; //进⾏下⼀次循环}printf("accept client ip:%s:%d\n",inet_ntoa(client_addr.sin_addr),client_addr.sin_port);//inet_ntoa将⼀个⼗进制⽹络字节序转换为点分⼗进制IP格式的字符串。
利用socket进行数据通信与传输的步骤

利用socket进行数据通信与传输的步骤Socket是计算机之间进行数据传输和通信的标准接口。
利用Socket可以方便地进行网络编程,实现不同设备之间的数据交换和传输。
下面将介绍Socket进行数据通信和传输的步骤,以及一些注意事项。
1. 创建Socket连接首先,需要在客户端和服务器端分别创建Socket连接。
在客户端,可以使用socket.connect()方法;在服务器端,可以使用socket.bind()方法。
这些方法都需要指定IP地址和端口号,以确保连接成功。
2. 发送数据一旦连接成功,就可以开始发送数据。
在Python中,可以使用socket.send()方法发送数据。
这个方法需要传入一个字符串参数,表示要发送的数据。
如果要发送二进制数据,则需要使用socket.sendall()方法。
这个方法需要传入一个字节串参数。
3. 接收数据一旦数据发送成功,服务器端就可以接收到这些数据。
在Python 中,可以使用socket.recv()方法接收数据。
这个方法需要传入一个整数参数,表示要接收的数据大小。
如果数据不足这个大小,则该方法会阻塞,等待更多数据到达。
4. 处理数据一旦接收到数据,就需要对这些数据进行处理。
这通常包括解析数据、验证数据、存储数据等操作,以确保数据的正确性和完整性。
5. 关闭连接最后,需要在客户端和服务器端分别关闭Socket连接。
在Python 中,可以使用socket.close()方法关闭连接。
这个方法不需要传入任何参数,只需要调用即可。
在进行Socket编程时,还需要注意一些事项。
比如,需要指定协议类型(如TCP或UDP)、设置超时时间、处理异常等。
此外,还需要考虑数据安全性和加密性等问题,以确保数据在传输过程中不会被恶意攻击者窃取或篡改。
总之,Socket编程是实现计算机间数据通信和传输的重要方法,可以应用于各种场景,如互联网、物联网、机器人等领域。
在使用Socket时,需要严格遵循以上步骤和注意事项,以确保数据的正确传输和保密性。
socket数据传输原理

socket数据传输原理在计算机网络中,Socket是网络通信的一种机制,它用于在不同的主机之间传输数据。
Socket数据传输原理可以分为以下几个步骤:1.建立连接:客户端与服务器之间通过Socket建立连接。
客户端通过调用Socket库函数创建一个Socket对象,并指定服务器的IP地址和端口号。
服务器通过调用Socket库函数创建一个Socket对象,并绑定到一个指定的IP地址和端口号上。
当客户端向服务器发起连接请求时,服务器会接收到该连接请求,并返回一个表示连接已建立的Socket对象。
2.数据读写:一旦连接建立,客户端和服务器可以通过各自的Socket对象进行数据读写操作。
客户端可以向服务器发送数据,服务器可以接收数据并进行处理;服务器可以向客户端发送数据,客户端可以接收数据并进行处理。
这些数据可以是文本、图片、音视频等任意类型的数据。
3.数据分片传输:当数据传输量较大时,Socket会将数据分成多个较小的数据包进行传输。
这样可以避免网络拥塞和数据丢失的问题。
发送方将数据分片并打包成数据包,然后依次发送给接收方。
接收方在接收到数据包后进行解包,恢复原始数据。
4.数据确认和重传:在数据传输过程中,接收方会向发送方发送一个确认消息,表示已成功接收到数据。
如果发送方没有收到接收方的确认消息,或者接收方接收到的数据包有误,发送方会根据一定的策略进行重传,以确保数据的可靠传输。
5.连接关闭:当数据传输完成或者不再需要进行数据传输时,客户端和服务器可以通过调用Socket对象的关闭方法来关闭连接。
关闭连接后,客户端和服务器将无法进行数据传输。
总体而言,Socket数据传输原理是通过建立连接、数据读写、数据分片传输、数据确认和重传以及连接关闭等步骤来实现数据在网络中的传输。
VB-ptop通讯

用Visual Basic实现点对点通讯使用TCP协议时,如果需要创建一个客户应用程序,就必须识别服务器的名称或IP地址。
应用程序的通信端口随时都将仔细监测对方发出的消息,这是系统进行可靠连接的保证。
一旦连接发生,任何一方都可以通过SendData 发送和接收数据,并借助GetData把自己的数据分离出来。
传送数据时,需要先设定客户机的LocalPort属性,服务器则只需要把RemoteHost属性设定为客户机以太网的地址,并设定与客户机LocalPort属性相同的端口地址,借助SendData方法开始发送消息。
客户机则在GetData事件中通过DataArrival 事件分离出发送的信息。
一个Winsock控件可以让本地计算机连接到远程的计算机上,同时使用UDP或TCP协议,两个协议都能创建客户机和服务器应用。
使用Winsock控件时,通信的双方需要选定相同的协议。
TCP协议适用于传送大容量、需要安全性保证的数据文件,而UDP协议适用于需要分别与很多下属通信,或者建立的连接比较多且为时变的情况,特别是在数据量很小的时候。
设定时可以使用Winsock1.Protocol =sckTCPProtocol方法,首先要找到你的计算机的名称,并把它添入Winsock的LocalHost属性中。
创建一个应用程序时,首先要确定你建立的是客户方应用还是服务器服务,只有建立的服务器应用开始工作,并进入监听状态时,客户应用程序才开始建立连接,进入正常的通信状态。
笔者建立了一个应用程序,它的功能是当客户方的鼠标移动时,服务器应用程序上能够实时显示该鼠标的位置。
下面是建立服务器应用的方法:1.创建一个新的标准EXE文件;2.加入一个Winsock控件;3.加入如下代码:建立客户应用的方法为:1.创建一个新的标准EXE文件;2.加入一个Winsock控件;3.加入两个Text框——txtx和txty;4.加入如下代码:接收数据以上例程实现的是一个非常简单的点对点通信,在此基础上略加改造,可以形成功能复杂的实时计算机网络A-A交互通信系统,用于控制、图形仿真等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VB中使用WinSock控件传送文件传送文件对于网络编程来说是基本的功能,比如远程控制软件。
在编制一个软件时,我从网上下了很多传文件的程序,这些程序提供的传文件功能根本就不能用。
传文本还可以,传二进制文件根本就不行。
因此,作为一个基本的功能模块,有必要单独介绍一下。
首先,在VB中要传送字符串,你可以这样写:Dim strData As StringstrData = "Test"Winsock1.SendData strData但是如果你传送的二进制文件,你还能用String变量来存放吗?从理论上分析是不行的,我也做了实验,确实是不行的。
文件虽然可以传,但是接受的文件和发送的不一样,原因可能是二进制文件里可以有任何"字符",但是不是所有的字符都可以放在String变量里。
除了String类型的变量,VB中其他类型的变量都只有几个字节长,难道一次只能发几个字节吗?那样岂不是要累死机器了!其实,情况没有那么悲观,我们完全可以使用数组来解决这个问题,就是使用byte数组。
把要传送的文件都读到数组里,然后发送出去。
程序如下:FileName 为要传送的文件名,WinS为发送文件的WinSock控件。
这是一个发送端的程序。
Public Sub SendFile(FileName As String, WinS As Winsock)Dim FreeF As Integer '空闲的文件号Dim LenFile As Long '文件的长度Dim bytData() As Byte '存放数据的数组FreeF = FreeFile '获得空闲的文件号Open FileName For Binary As #FreeFile '打开文件DoEventsLenFile = LOF(FreeF) '获得文件长度ReDim bytData(1 To LenFile) '根据文件长度重新定义数组大小Get #FreeF, , bytData '把文件读入到数组里Close #FreeF '关闭文件WinS.SendData bytData '发送数据End Sub接受端的程序如下:Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)Dim bytData() As ByteDim ff = FreeFileOpen strFileName For Binary As #fReDim bytData(1 To bytesTotal)Winsock1.GetData bytDataPut #f, i, bytDatai = i + bytesTotal '保证每次写都是在文件的末尾, i是个全局变量Close #fEnd Sub这里有两个需要注意的地方,ReDim Preserve bytData(1 To LenFile),下标是从1开始的,如果你写成ReDim bytData( LenFile),下标就是从0开始了,数组就有LenFile+1长了。
LenFile = LOF(FreeFile)中的LOF是获得文件长度的函数,是VB里带的,我见过很多例子用API,或者循环的读直到末尾来获取文件长度,这样都是很麻烦的,使用LOF函数就可以了。
这样的程序,即可以传送文本文件,也可以传送二进制文件。
但是你有没有发现这个程序的问题呢?如果我要传送一个50M的文件呢?系统可以为bytData分配50M的内存空间吗?于是笔者拿一个50M的文件做实验吧,接收到的文件和原来的文件不一样,比原来的大。
问题出在那呢?首先,根据文件大小重新定义bytData数组的大小本身就有问题,系统是不可能无限制的给数组分配空间的,即使可以,也会造成系统响应变慢。
在传50M文件的时候,系统就跟死机了一样。
那么怎么解决这个问题呢,一个自然的想法就是把数据分段传送。
程序如下:发送程序, iPos是个全局变量,初始值为0。
这个变量保存着当前数据的位置。
Const iMax = 65535是每个数据块的大小。
dim ipos as longConst iMax = 65535Dim FreeF As Integer '空闲的文件号Dim LenFile As Long '文件的长度Dim bytData() As Byte '存放数据的数组FreeF = FreeFile '获得空闲的文件号Open FileName For Binary As #FreeF '打开文件DoEventsLenFile = LOF(FreeF) '获得文件长度If LenFile <= iMax Then '如果要发送的文件小于数据块大小,直接发送ReDim bytData(1 To LenFile) '根据文件长度重新定义数组大小Get #FreeF, , bytData '把文件读入到数组里Close #FreeF '关闭文件WinS.SendData bytData '发送数据Exit SubEnd If'文件大于数据块大小,进行分块发送Do Until (iPos >= (LenFile - iMax)) '发送整块数据的循环ReDim bytData(1 To iMax)Get #FreeF, iPos + 1, bytDataWinS.SendData bytDataiPos = iPos + iMax '移动iPos,使它指向下来要读的数据Loop'这里要注意的是,必须检查文件有没有剩下的数据,如果文件大小正好等于数据块大小的' 整数倍,那么就没有剩下的数据了ReDim bytData(1 To LenFile - iPos) '发送剩下的不够一个数据块的数据Get #FreeF, iPos + 1, bytDataWinS.SendData bytDataClose #FreeF下面是接收端的程序:Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)Dim bytData() As ByteDim lLenFile As LongDim ff = FreeFileOpen strFileName For Binary As #f 'strFileName是文件名lLenFile = LOF(f)ReDim bytData(1 To bytesTotal)Winsock1.GetData bytDataIf lLenFile = 0 Then 'lLenFile=0表示是第一次打开文件,这里有个问题,就是'如果如果该文件存在的话,就会出错,应该在打开前检查文件是否存在。
(这里我省略了)Put #f, 1, bytDataElsePut #f, lLenFile + 1, bytDataEnd IfClose #fEnd SubOption ExplicitConst PACKSIZE As Long = 65536 '每包大小为64KPrivate filepath As StringPrivate filename As StringPrivate filelength As Long '存储文件信息Private data() As BytePrivate pack As LongPrivate sendedData As Long '数据缓冲区,文件包数,已传输的数据Private alreadySend As BooleanPrivate cmsStr As StringConst fileD As String = "D:\NMSPlugin\source\LanBus.rar" Private Sub cmdConnectClient_Click()WinsockSend.CloseWinsockSend.Protocol = sckTCPProtocolWinsockSend.RemoteHost = "127.0.0.1"WinsockSend.RemotePort = 8080WinsockSend.Connect '连接客户端End SubPrivate Sub cmdSendFile_Click()Open fileD For Binary As #3filename = "LanBus.rar"filelength = LOF(3)Close #3WinsockSend.SendData ("NMSP_AYUREADY")End SubPrivate Sub WinsockSend_Connect()StatusBar1.Caption = "已与客户端建立连接。
"End Sub'"发送文件"按钮事件代码:Private Sub sendFile()Dim i As IntegerDim j As LongDim m As Longfilepath = fileDStatusBar1.Caption = "向客户端传送文件:" & filename & " 大小为:" & filelength'计算需要传输文件的包数pack = (filelength - sendedData) \ PACKSIZEIf ((filelength - sendedData) Mod PACKSIZE) <> 0 Thenpack = pack + 1End IfIf pack = 0 Thenpack = pack + 1End If'传输文件Open filepath For Binary As #1For i = 1 To pack'如果只有一包If pack = 1 ThenDebug.Print "filename=" & filename & " | filelength=" & filelength & " | send=" & sendedDataReDim data(filelength - sendedData)'读取数据For j = sendedData + 1 To filelengthGet #1, j, data(j - sendedData)Next'更新已传输文件的数据sendedData = filelength'发送文件数据WinsockSend.SendData data'如果是最后一包ElseIf i + 1 = pack Then'读取最后一包的数据ReDim data(filelength - sendedData)For j = 1 To filelength - sendedDataGet #1, sendedData + j, data(j)Next'发送文件数据WinsockSend.SendData data'更新已传输文件的数据sendedData = filelengthExit ForElse'将文件数据放到数据缓冲区ReDim data(PACKSIZE)For m = 1 To PACKSIZEGet #1, sendedData + m, data(j)Next'发送文件数据WinsockSend.SendData data'更新已传输文件的数据sendedData = sendedData + PACKSIZEEnd IfProgressBar1.Value = Int((sendedData / filelength) * 100)NextProgressBar1.Value = Int((sendedData / filelength) * 100)Close #1alreadySend = FalseEnd Sub'客户端反馈Private Sub WinsockSend_DataArrival(ByVal bytesTotal As Long)Dim cmdStr As StringWinsockSend.GetData cmdStr, vbStringDebug.Print cmdStrIf Mid(cmdStr, 1, 13) = "NMSP_IAMREADY" Then '客户端已准备好接收时,要求客户端报告已经接收的文件大小WinsockSend.SendData "NMSP_RPTCURLE" & filenameElseIf Mid(cmdStr, 1, 13) = "NMSP_REQFILEN" Then '客户端要求发送文件名称WinsockSend.SendData "NMSP_FILENAME=" & filenameElseIf Mid(cmdStr, 1, 13) = "NMSP_REQFILES" Then '客户端要求发送文件大小WinsockSend.SendData "NMSP_FILESIZE=" & filelength 'WinsockSend.GetData send, vbLongElseIf Mid(cmdStr, 1, 13) = "NMSP_RECEIVED" Then '收到客户端已经接收到的文件大小报告Debug.Print "客户端已经接收了" & Mid(cmdStr, 14, Len(cmdStr))sendedData = Mid(cmdStr, 15, Len(cmdStr))If filelength = sendedData ThenWinsockSend.SendData "NMSP_SENDDONE"'初始化文件名,大小,已接收大小,遍历是否还需要向别的客户端发送Let filename = ""Let filelength = 0Let sendedData = 0WinsockSend.CloseStatusBar1.Caption = "文件发送完毕!"ElseCall sendFileEnd IfEnd IfEnd Sub'========================================================== 客户端======================================================Option ExplicitDim flag As Boolean '设置是否继续接收文件的开关标识Private readyReceive As BooleanPrivate filename As StringPrivate tempfile As StringPrivate realfile As StringPrivate reveivePath As StringPrivate filelength As Long '存储文件信息Private data() As Byte, received As Long '声明数据缓冲区和已接收的数据Private Sub Form_Load()reveivePath = App.Path & "\received\"WinsockReceive.Protocol = sckTCPProtocolWinsockReceive.LocalPort = 8080WinsockReceive.ListenCall initReceiveStateEnd SubPrivate Sub WinsockReceive_Connect()StatusBar1.Caption = "已经连接到服务器"End SubPrivate Sub WinsockReceive_ConnectionRequest(ByVal requestID As Long) If WinsockReceive.State <> 0 ThenWinsockReceive.CloseEnd IfWinsockReceive.Accept requestIDStatusBar1.Caption = "已接受连接请求。