编写网络文件传送程序|用java编写TCP文件传输程序

❶ 请教用C语言编的借助UDP协议实现的文件传输的程序

本程序在 Windows 7 Visual Studio 2015 和 Linux Ubuntu 15.04 GCC 5.11 下均编译运行测试通过。

本程序支持 Windows 和 Linux 之间传送文件,如果要在 Windows 和 Linux 之间传送文件,文件名不能出现中文。

本程序支持无线 WiFi,支持 USB 收发器,但仅支持局域网内传送文件,传送文件需要输入对方的 IP 地址。

本程序包括服务器端和客户端,既可以发送文件又可以接收文件。如果要在同一台机器上测试需要同时打开两个程序。

Windows 下查看本机 IP 地址的命令是:

ipconfig

Linux 下查看本机 IP 地址的命令是:

ifconfig

以下是程序代码:

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#ifdef_MSC_VER#include<winsock2.h>#include<windows.h>#pragmacomment(lib,"ws2_32.lib")#else#include<pthread.h>#include<unistd.h>#include<signal.h>#include<sys/socket.h>#include<arpa/inet.h>#endif//存放发送接收字符数组大小#defineSIZEA65501//每次发送接收字节数#defineSIZEB65500typedefstructsockaddr_inSockAddrIn;SockAddrInserverAddr,remoteAddr,clientAddr;//端口号intiServerPort,iClientPort;//新建socket信息intiUDP;//字符串转整型intstrToInt(char*acStr){inti,iIndex=0,iNum=0,iSize=0;if(acStr[0]=='+'||acStr[0]=='-')iIndex=1;for(iSize=iIndex;;iSize++)if(acStr[iSize]<'0'||acStr[iSize]>'9')break;for(i=iIndex;i<iSize;i++)iNum+=(int)pow(10,iSize-i-1)*(acStr[i]-48);if(acStr[0]=='-')iNum=-iNum;returniNum;}//整型转字符串voidintToStr(intiInt,char*acStr){intiIndex=0,iSize,iNum,iBit,i,j;if(iInt<0){acStr[0]='-';iInt=-iInt;iIndex=1;}for(i=0;;i++)if(iInt<pow(10,i))break;iSize=i;for(i=0;i<iSize;i++){iNum=pow(10,iSize-i-1);iBit=iInt/iNum;iInt-=iNum*iBit;acStr[i+iIndex]=iBit+48;}if(iSize!=0)acStr[iSize+iIndex]='';else{acStr[0]='0';acStr[1]='';}}voidsleepUDP(intiSleep){#ifdef_MSC_VERSleep(iSleep);#elseusleep(iSleep*1000);#endif}voidopenUDP(char*acIpAddr){#ifdef_MSC_VER//Winsows启用socketWSADATAwsadata;if(WSAStartup(MAKEWORD(1,1),&wsadata)==SOCKET_ERROR){printf("启用socket失败");exit(0);}#endif//新建socketif((iUDP=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))==-1){printf("新建socket失败");exit(0);}//清零memset(&serverAddr,0,sizeof(serverAddr));memset(&clientAddr,0,sizeof(clientAddr));//设置协议IP地址及PortserverAddr.sin_family=AF_INET;serverAddr.sin_port=htons(iServerPort);serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);clientAddr.sin_family=AF_INET;clientAddr.sin_port=htons(iClientPort);clientAddr.sin_addr.s_addr=inet_addr(acIpAddr);//绑定端口,监听端口if(bind(iUDP,(structsockaddr*)&serverAddr,sizeof(serverAddr))==-1){printf("绑定端口失败");exit(0);}}voidcloseUDP(void){#ifdef_MSC_VER//Winsows关闭socketclosesocket(iUDP);WSACleanup();#endif}//要发送的字符串characSendStr[SIZEA];//接收到的字符串characRecvStr[SIZEA];//请求信息characReq[SIZEA];//文件名字符串characFileName[SIZEA];//文件字节数字符串characFileSize[SIZEA];intiSize,iNameSize;//接收文件名#ifdef_MSC_VERDWORDWINAPIrecvName(LPVOIDp)#elsevoid*recvName(void*arg)#endif{intiAddrSize=sizeof(remoteAddr);acReq[0]='n';acReq[1]='a';acReq[2]='m';acReq[3]='e';acReq[4]='';acRecvStr[0]='';printf("%s","正在发送请求信息!");//发送请求信息sendto(iUDP,acReq,strlen(acReq),0,(structsockaddr*)&clientAddr,sizeof(clientAddr));//每次发送请求信息后等待一段时间sleepUDP(10);//接收文件名iSize=recvfrom(iUDP,acRecvStr,SIZEB,0,(structsockaddr*)&remoteAddr,&iAddrSize);return0;}//接收文件voidrecvFile(char*acDirName,char*acIpAddr){FILE*pFile=NULL;inti,iFileSize,iRecvNum,iAddrSize=sizeof(remoteAddr);//路径文件名characDirAndFileName[SIZEA];openUDP(acIpAddr);//接收文件名for(;;){//创建线程#ifdef_MSC_VERHANDLEhThread;DWORDthreadId;hThread=CreateThread(NULL,0,recvName,0,0,&threadId);//每次发送后等待一段时间sleepUDP(1000);//强制终止线程TerminateThread(hThread,0);#elsepthread_tthread;void*thread_arg=(pthread_t)0;pthread_create(&thread,NULL,recvName,(void*)&thread_arg);//每次发送后等待一段时间sleepUDP(1000);//强制终止线程pthread_cancel(thread);#endifif(acRecvStr[0]!=''){acRecvStr[iSize]='';printf("文件名为:%s",acRecvStr);break;}}acDirAndFileName[0]='';strcat(acDirAndFileName,acDirName);//连接路径名和文件名strcat(acDirAndFileName,acRecvStr);//如果已经有这个文件了就清空文件内容pFile=fopen(acDirAndFileName,"w");fclose(pFile);acReq[0]='s';acReq[1]='i';acReq[2]='z';acReq[3]='e';acReq[4]='';//接收文件字节数for(;;){//发送请求信息sendto(iUDP,acReq,strlen(acReq)+1,0,(structsockaddr*)&clientAddr,sizeof(clientAddr));//每次发送请求信息后等待一段时间sleepUDP(10);//接收文件字节数acRecvStr[0]='';iSize=recvfrom(iUDP,acRecvStr,SIZEB,0,(structsockaddr*)&remoteAddr,&iAddrSize);if(acRecvStr[0]!=''){acRecvStr[iSize]='';iFileSize=strToInt(acRecvStr);printf("文件字节数为:%d",iFileSize);break;}}//以追加方式写入文件pFile=fopen(acDirAndFileName,"ab");//文件分几次接收iRecvNum=iFileSize/SIZEB;//接收文件for(i=0;i<iRecvNum;i++){intToStr(i,acReq);for(;;){//发送请求信息sendto(iUDP,acReq,strlen(acReq)+1,0,(structsockaddr*)&clientAddr,sizeof(clientAddr));printf("%s正在接收文件的第%d段",acReq,i);//每次发送请求信息后等待一段时间sleepUDP(10);//接收一段文件iSize=recvfrom(iUDP,acRecvStr,SIZEB,0,(structsockaddr*)&remoteAddr,&iAddrSize);if(iSize==SIZEB){//以追加方式写入文件fwrite(acRecvStr,sizeof(char),iSize,pFile);break;}}}//接收文件剩余字节iSize=iFileSize%SIZEB;if(iSize>0){acReq[0]='l';acReq[1]='a';acReq[2]='s';acReq[3]='t';acReq[4]='';for(;;){//发送请求信息sendto(iUDP,acReq,strlen(acReq)+1,0,(structsockaddr*)&clientAddr,sizeof(clientAddr));//每次发送请求信息后等待一段时间sleepUDP(10);//接收文件剩余字节if(recvfrom(iUDP,acRecvStr,iSize,0,(structsockaddr*)&remoteAddr,&iAddrSize)==iSize){//以追加方式写入文件fwrite(acRecvStr,sizeof(char),iSize,pFile);break;}}}printf("%s","文件接收完毕!");//关闭文件fclose(pFile);//关闭连接closeUDP();}//发送文件名#ifdef_MSC_VERDWORDWINAPIsendName(LPVOIDp)#elsevoid*sendName(void*arg)#endif{intiAddrSize=sizeof(remoteAddr);acRecvStr[0]='';//接收请求printf("%s","正在接收请求信息!");recvfrom(iUDP,acRecvStr,5,0,(structsockaddr*)&remoteAddr,&iAddrSize);//每次接收请求信息后等待一段时间sleepUDP(10);//如果请求信息正确发送文件名if(acRecvStr[0]=='n'&&acRecvStr[1]=='a'&&acRecvStr[2]=='m'&&acRecvStr[3]=='e'&&acRecvStr[4]=='')sendto(iUDP,acFileName,iNameSize,0,(structsockaddr*)&clientAddr,sizeof(clientAddr));return0;}//发送文件voidsendFile(char*acDirAndFileName,char*acIpAddr){inti,j,iFileSize,iSendNum,iAddrSize=sizeof(remoteAddr);FILE*pFile=NULL;pFile=fopen(acDirAndFileName,"rb");fseek(pFile,0,SEEK_END);//文件字节数iFileSize=ftell(pFile);intToStr(iFileSize,acFileSize);//printf("%s",acDirAndFileName);//获取文件名长度iSize=strlen(acDirAndFileName);for(i=iSize-1,iNameSize=0;i>=0;i–,iNameSize++)if(acDirAndFileName[i]=='\'||acDirAndFileName[i]=='/')break;//printf("%d",iNameSize);//截取文件名for(i=0;i<iNameSize;i++)acFileName[i]=acDirAndFileName[iSize-iNameSize+i];acFileName[iNameSize]='';//printf("%s",acFileName);openUDP(acIpAddr);//发送文件名for(;;){//创建线程#ifdef_MSC_VERHANDLEhThread;DWORDthreadId;hThread=CreateThread(NULL,0,sendName,0,0,&threadId);//每次接收请求信息后等待一段时间sleepUDP(1000);//强制终止线程TerminateThread(hThread,0);#elsepthread_tthread;void*thread_arg=(pthread_t)0;pthread_create(&thread,NULL,sendName,(void*)&thread_arg);//每次接收请求信息后等待一段时间sleepUDP(1000);//强制终止线程pthread_cancel(thread);#endif//如果请求信息正确退出循环if(acRecvStr[0]=='n'&&acRecvStr[1]=='a'&&acRecvStr[2]=='m'&&acRecvStr[3]=='e'&&acRecvStr[4]=='')break;}//发送文件字节数for(;;){acRecvStr[0]='';//接收请求recvfrom(iUDP,acRecvStr,5,0,(structsockaddr*)&remoteAddr,&iAddrSize);//每次接收请求信息后等待一段时间sleepUDP(10);//如果请求信息正确if(acRecvStr[0]=='s'&&acRecvStr[1]=='i'&&acRecvStr[2]=='z'&&acRecvStr[3]=='e'&&acRecvStr[4]==''){//发送文件字节数sendto(iUDP,acFileSize,strlen(acFileSize),0,(structsockaddr*)&clientAddr,sizeof(clientAddr));break;}}iSendNum=iFileSize/SIZEB;//发送文件if(iSendNum>0){for(i=0;;i++){acRecvStr[0]='';//接收请求recvfrom(iUDP,acRecvStr,SIZEB,0,(structsockaddr*)&remoteAddr,&iAddrSize);printf("%s正在发送文件的第%d段",acRecvStr,i);//每次接收请求信息后等待一段时间sleepUDP(10);fseek(pFile,strToInt(acRecvStr)*SIZEB,SEEK_SET);fread(acSendStr,1,SIZEB,pFile);//printf("%s",acSendStr);//发送一段文件sendto(iUDP,acSendStr,SIZEB,0,(structsockaddr*)&clientAddr,sizeof(clientAddr));if(strToInt(acRecvStr)>=iSendNum-1)break;}}//发送文件剩余字节iSize=iFileSize%SIZEB;if(iSize>0){for(;;){acRecvStr[0]='';//接收请求recvfrom(iUDP,acRecvStr,5,0,(structsockaddr*)&remoteAddr,&iAddrSize);//每次接收请求信息后等待一段时间sleepUDP(10);//如果请求信息正确if(acRecvStr[0]=='l'&&acRecvStr[1]=='a'&&acRecvStr[2]=='s'&&acRecvStr[3]=='t'&&acRecvStr[4]==''){fseek(pFile,iSendNum*SIZEB,SEEK_SET);fread(acSendStr,1,iSize,pFile);//printf("%s",acSendStr);//发送文件剩余字节sendto(iUDP,acSendStr,iSize,0,(structsockaddr*)&clientAddr,sizeof(clientAddr));break;}}}printf("%s","文件发送完毕!");//关闭连接closeUDP();}intmain(void){characDirName[SIZEA];characDirAndFileName[SIZEA];characIpAddr[15];inti,iOption=0,iSize=0;FILE*pFile=NULL;charcLast='\';option:printf("%s","****************************************************本程序包括服务器端和客户端,既可以发送文件又可以接收文件。支持无线WiFi,支持USB收发器,但仅支持局域网内传送文件。如果要在Windows和Linux之间传送文件,文件名不能出现中文。如果要在同一台机器上测试需要同时打开两个程序。****************************************************");printf("%s","请输入选项,1.发送文件、2.接收文件。");scanf("%d",&iOption);//发送文件if(iOption==1){iServerPort=1025;iClientPort=1024;fileName:printf("%s","请输入需要发送的路径文件名。Windows路径文件名格式:C:\install.txtLinux路径文件名格式:/home/install.txt");scanf("%s",acDirAndFileName);pFile=fopen(acDirAndFileName,"rb");if(pFile==NULL){printf("%s","读取文件失败,请重新输入文件名。");gotofileName;}//关闭文件fclose(pFile);printf("%s","请输入接收文件方的IP地址,不能有空格。例如:192.168.1.104");scanf("%s",acIpAddr);sendFile(acDirAndFileName,acIpAddr);}//接收文件elseif(iOption==2){iServerPort=1024;iClientPort=1025;dirName:printf("%s","请输入保存文件的路径名。Windows路径名格式:C:\img\Linux路径名格式:/home/");scanf("%s",acDirName);iSize=strlen(acDirName);//检查是不是Linux路径名for(i=0;i<iSize;i++){if(acDirName[i]=='/'){cLast='/';break;}}//检查路径名最后一个字符是不是或/if(acDirName[iSize-1]!=cLast){acDirName[iSize]=cLast;acDirName[iSize+1]='';}acDirAndFileName[0]='';strcat(acDirAndFileName,acDirName);strcat(acDirAndFileName,"a.txt");//试探保存一个无关紧要的文件pFile=fopen(acDirAndFileName,"w");if(pFile==NULL){printf("%s","该路径无法创建文件,请重新输入路径名。");gotodirName;}else{//关闭文件fclose(pFile);//删除文件remove(acDirAndFileName);}printf("%s","请输入发送文件方的IP地址,不能有空格。例如:192.168.2.249");scanf("%s",acIpAddr);recvFile(acDirName,acIpAddr);}else{printf("%s","没有这个选项,请重新输入。");gotooption;}return0;}

❷ C语言socket编程实现网络数据传输

仅供参考// serverTCP.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"using namespace std;long long cnt = 0;void transFile(SOCKET s){printf("新子服务%d……",cnt);send(s,"welcome to TCP FILE SERVER !",strlen("welcome to TCP FILE SERVER !")+1,0);char Buf[BUFSIZE];FILE *fp;//printf("客户端已打开\n请输入存放文件地址:\n");char FilePath[128]={"0"};ltoa(cnt,FilePath,10);if((fp=fopen(FilePath,"wb"))==NULL){printf("文件未打开\n");return;}else{send(s,"开始传送",strlen("开始传送")+1,0); //得到文件大小char Size[20];long int FileSize=0;recv(s,Size,21,0);FileSize=atol(Size);printf("得到文件大小: %d\n",FileSize);//开始传送 char Block[BUFSIZE];long int x=0;while (1){x += BUFSIZE;if(x < FileSize){recv(s,Block,BUFSIZE+1,0);fwrite(Block,1,BUFSIZE,fp);}else{recv(s,Block,FileSize+BUFSIZE-x+1,0);printf("文件接收完毕\n");fwrite(Block,1,FileSize+BUFSIZE-x,fp);fclose(fp);break;}}}fclose(fp);closesocket(s);}int _tmain(int argc, _TCHAR* argv[]){WORD myVersionRequest;WSADATA wsaData;myVersionRequest=MAKEWORD(1,1);int err;err = WSAStartup(myVersionRequest,&wsaData);if (!err){printf("服务器启动……\n");} else{printf("服务器启动失败!");exit(0);}SOCKET serSocket = socket(AF_INET,SOCK_STREAM,0);//创建了可识别套接字SOCKADDR_IN addr;addr.sin_family=AF_INET;addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//ip地址addr.sin_port=htons(PORTBASE);//绑定端口bind(serSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));//绑定完成listen(serSocket,ACESIZE);//其中第二个参数代表能够接收的最多的连接数SOCKADDR_IN clientAddr;int len = sizeof(SOCKADDR);while(1){cnt++;SOCKET serConn;serConn = accept(serSocket,(SOCKADDR*)&clientAddr,&len);//如果这里不是accept而是conection的话。。就会不断的监听if(_beginthread((void (*)(void *))transFile, ACESIZE,(void *)serConn) < 0)return 0;}return 0;}// clientTCP.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"using namespace std;int _tmain(int argc, _TCHAR* argv[]){WORD myVersionRequest;WSADATA wsaData;myVersionRequest=MAKEWORD(1,1);int err;err=WSAStartup(myVersionRequest,&wsaData);if (!err){printf("已打开套接字\n");} else{//进一步绑定套接字printf("套接字未打开!");return 0;}SOCKET cliSocket =socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN addr;char ip_addr[16]={"127.0.0.1"};addr.sin_addr.S_un.S_addr=inet_addr(ip_addr);addr.sin_family=AF_INET;addr.sin_port=htons(PORT);char ACK[64];connect(cliSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));//开始连接recv(cliSocket,ACK,sizeof(ACK),0);printf("%s\n",ACK); FILE *fp;int FileSize=0;char Block[BUFSIZE]={"0"};char FilePath[128]={"0"};int i=0;do{printf("请输入文件地址:\n"); gets(FilePath);i = 0;if((fp=fopen(FilePath,"rb"))==NULL){i = 1;printf("文件打开失败\n");}}while(i); fseek(fp,0L,SEEK_END); FileSize=ftell(fp);printf("待传送文件大小: %d\n",FileSize);printf("等待服务器接受……\n");recv(cliSocket,Block,sizeof(Block),0);printf("%s\n",Block);if(strcmp(Block,"开始传送")==0){char Size[20];ltoa(FileSize,Size,10);send(cliSocket,Size,sizeof(Size),0);fseek(fp,0L,SEEK_SET);long int y=0;char trans[BUFSIZE];while(!feof(fp)){fread(trans,1,BUFSIZE,fp);y=y+BUFSIZE;if(y<FileSize){send(cliSocket,trans,BUFSIZE+1,0);}else{send(cliSocket,trans,FileSize+BUFSIZE-y+1,0);closesocket(cliSocket);WSACleanup();}}}printf("文件发送完毕\n");fclose(fp);closesocket(cliSocket);WSACleanup();system("pause");return 0;}

❸ 利用java编写一个程序利用Socket和ServerSocket类,实现网络的点对点文件传输

服务器端代码,支持多用户访问,端口号9001:package net;import java.net.*;import java.io.*;public class Server extends Thread {private ServerSocket serverSocket;private Socket serverEndPoint;private InputStream in;private OutputStream out;public Server() {}private Server(Socket serverEndPoint) {this.serverEndPoint = serverEndPoint;}public void startService(int port) throws IOException, InterruptedException {System.out.println("service started…");serverSocket = new ServerSocket(port);while (true)new Server(serverSocket.accept()).start();}public void run() {try {in = serverEndPoint.getInputStream();out = serverEndPoint.getOutputStream();DataInputStream dis = new DataInputStream(in);DataOutputStream dos = new DataOutputStream(out);String request;while (true) {if ((request = dis.readUTF()) != null) {if (request.trim().equals("bye")|| request.trim().equals("exit")|| request.trim().equals("quit"))break;System.out.println(serverEndPoint.getInetAddress().getCanonicalHostName()+ " is getting '" + request.trim() + "'…");File f = new File(request.trim());if (!f.exists()) {dos.writeBoolean(false);dos.writeUTF("File '" + f.getPath()+ "' doesn't exist!");continue;}if (f.isDirectory()) {dos.writeBoolean(false);dos.writeUTF("'" + f.getPath() + "' is a folder!");continue;}FileInputStream fis = new FileInputStream(f);int i;int count = 0;byte[] buf = new byte[1024];dos.writeBoolean(true);dos.writeLong(f.length());while ((i = fis.read(buf)) != -1) {dos.write(buf, 0, i);count += i;}fis.close();Thread.sleep(1000);dos.writeUTF("File '" + f.getName()+ "' has been saved in the current folder.");}}System.out.println("Connection to "+ serverEndPoint.getInetAddress().getCanonicalHostName()+ " is ready to close…");Thread.sleep(5000);dis.close();dos.close();serverEndPoint.close();} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {try {new Server().startService(90011);} catch (Exception e) {e.printStackTrace();}}}

❹ 什么程序可以让两台电脑之间相互传文件

一类是通过U盘、移动硬盘的存储介质进行传输;一类是通过网络记性文件传送:一种是通过系统自带的软件进行文件共享;一种是通过三方软件进行文件共享。文件共享两台电脑处于同一个局域网或通过网线直接连接,可以使用该方法;点击需要共享的文件夹,右击“属性”,点击“共享”按钮,按照提示完成共享设置;另外一台电脑可以在开始运行(快捷键WIN+R)中直接输入共享电脑IP进行访问。建立FTP服务器建立FTP服务器进行文件共享,需要服务器类操作系统版本;适合单位内部进行文件共享和下载;不适合家庭用操作,设置步骤也不详细阐述了。三方软件传输文件支持局域网文件传输的软件很多,这里以传输为例;界面同QQ比较类似,显示较为友好;通过局域网可以共享文件或通过好友传输等两种方式进行传输。

❺ 用java编写TCP文件传输程序

1.调用类java.lang.Math的成员方法“public static double random()”运算下面表达式10000次, (int) (Math.random()*20+0.5) 统计其中生成的整数10,1,2,…,20的个数分别是内多容少,并输出统计结果。 2.调用类java.lang.Math的成员方法“public static double random()”设法生成10个互不相同的从‘a'到'z'字母,然后对这10个字母按从小到大的方式排序。输出排序前的字母序列和排序后的字母序列。 3.编写一个程序,要求输入5个学生的成绩(从0到100的整数),并将这5个数保存到文件“data.txt"中。然后再编写一个程序,从文件“data.txt”中读取这5个学生的成绩,计算并输出它们的平均数,然后再按照从小到大的顺序输出这5个学生的成绩。 4.编写一个程序,修改在上一题生成的文件“data.txt”中的文件内容,使得第三个学生的成绩变成为这5个学生的平均成绩,并在控制台窗口中输出在修改之后的文件内容

❻ 网络程序设计——文件传输工具,这个程序用怎么编

delphi试试,到一些大的delphi编程网站或论坛上应该能找到一些类似的文件传输程序

❼ 如何编写一个 能够传送文件 的 VB程序

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 '打开文件 DoEvents LenFile = LOF(FreeFile) '获得文件长度ReDim bytData(1 To LenFile) '根据文件长度重新定义数组大小Get #FreeFile, , bytData '把文件读入到数组里Close #FreeFile '关闭文件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 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 Sub

❽ 编写一个在局域网中的两台计算机之间传输文件的程序。分别使用TCP或UDP来完成(急求)

要实用的程序的话,用“飞鸽传书”,免费开源的局域网通讯工具。要简单明了的作业代码的话,直接网络搜索“socket通信范例”就好了


赞 (0)