制作一个文件传输软件|如何做一个能将文件上传到局域网服务器的软件适用于ANDROID系统

制作一个文件传输软件|如何做一个能将文件上传到局域网服务器的软件适用于ANDROID系统的第1张示图

㈠ 如何做一个能将文件上传到局域网服务器的软件,适用于ANDROID系统

服务器上共享一个目录就可以了,客户端用smb协议访问网络目录。目前已经有ES文件浏内览器等软件容已经实现了此功能。也有用ftp协议的。你自己开发的话就比较随意了,两边遵守同一个传输协议就行,当然服务端也能用vb来做

㈡ 怎么制作一个app,用来传输录音文件或者图片文件到电脑上

买联通iPhone无法越狱又想使用商务功能的可以参考下。使用一个名为:FileApp 的免费软件,在iTunes的 iTunes Store 里搜下就能找到,下载安装到手机上即可。它的原理就是相当于在局域网里使用FTP传输文件,手机作为于SERVER,电脑为客户端。使用步骤和QuickOffice类似,只需三步:步骤/方法 1打开手机的网络共享(设置/通用/网络),选择USB方式即可,并且将手机用USB连接到电脑; 2.在iPhone上打开FileApp,如下图AppFlie程序进入AppFile程序界面,在顶部有个无线电信号的图标(红色框),如下图 ,点击进入设置界面 AppFlie运行界面在“Sharing”界面,点一下"Start Sharing",前面的灯由红色变绿色,显示文字也为:"Stop Sharing",如下图所示,这样就OK了,说明软件的FTP SERVER已经设定成功。注意,这个时候不要退出这个界面,也就是说不要去点右上角的“Done”,否则可能连接不成功。AppFlie设置在电脑上打开“我的电脑”(注意不是IE),在地址栏里输入:ftp://192.168.20.1:2121,回车后即可看到手机里的目录,可以方便的把文件拖入或者拖出,和电脑传输文件(见下图)。FileApp支持的文件很多,OFFICE、PDF、压缩文件、音频视频等都可以读取和浏览。FileApp传输文件界面3设定快捷方式,以后就可以方便的读取文件了,不需要每次都设置地址。4桌面快捷方式END注意事项 不断有人提到在电脑上无法连接FTP,经过反复测试发现这个问题的确存在,原因不明,时好时坏,后来仔细查阅了AppFile官方网站的说明,他们讲早期AppFile版本是支持USB传输的,但是苹果通知他们要在下一个版本里去掉这个功能,只能通过WIFI来传输,目前不清楚iTunes上下载的1.7版本是否就是苹果要求的“下一个版本”。看来苹果就是不想让联通用户传输文件啊,以下是AppFile官方说明:AppFile官方说明但是也有解决办法,只要符合FTP协议,不论是WIFI 还是USB都应该能连接,下个CuteFtp 或者leapFtp客户端软件,就可以和手机的AppFile上传或下载文件了。CuteFtp 或者leapFtp的操作步骤较为简单,只需在新建FTP地址里输入:]ftp://192.168.20.1:2121 ,其他全为空,就可以连上手机里的AppFile了。这里顺便把CuteFtp设置一并讲下,安装后在软件里新建FTP站点,按下图设置即可,非常简单,确定后直接连接设定的AppFile站点即可连上手机。

㈢ 什么软件可以实现两台电脑之间的文件互传

通讯类的软件基本都能够发送文件,只要能够发送文件,两台电脑使用不同的帐号(互为好友)登录,即可相互间发送文件了,比如:QQ。这里用QQ(9.3.3版本)演示发送文件的操作流程:

一、打开QQ面板,找到对方QQ消息,双击打开。

㈣ 怎样开发个文件传输软件

UDP,文件随机读写既然是局域网,那么网络性能是很好的了。所以此时可以考虑使用性能最好的UDP方式来发送文件,将一个文件放到多个UDP包里,但是UDP是没有顺序的,换句话讲,可能随机的到达,这时,你需要标记每个UDP包,标记其中包含了是哪一块的数据,然后移动到那个位置,写入数据就可以了

㈤ 试用socket api借口设计一个文件传送软件,并编程实现,可自定义文件传输的通信。

我用C++写的,可以调试的!要加分啊啊!记得啊!呵呵…代码如下://功能:利用SOCKET传送文件的代码/*server.h*/ #pragma comment(lib, "WS2_32") #include #include //#include #include #ifndef COMMONDEF_H #define COMMONDEF_H #define MAX_PACKET_SIZE 10240 // 数据包的最大长度,单位是sizeof(char) #define MAXFILEDIRLENGTH 256 // 存放文件路径的最大长度 #define PORT 4096 // 端口号 #define SERVER_IP "127.0.0.1" // server端的IP地址 // 各种消息的宏定义 #define INVALID_MSG -1 // 无效的消息标识 #define MSG_FILENAME 1 // 文件的名称 #define MSG_FILELENGTH 2 // 传送文件的长度 #define MSG_CLIENT_READY 3 // 客户端准备接收文件 #define MSG_FILE 4 // 传送文件 #define MSG_SENDFILESUCCESS 5 // 传送文件成功 #define MSG_OPENFILE_ERROR 10 // 打开文件失败,可能是文件路径错误找不到文件等原因 #define MSG_FILEALREADYEXIT_ERROR 11 // 要保存的文件已经存在了 class CCSDef { public: #pragma pack(1) // 使结构体的数据按照1字节来对齐,省空间 // 消息头 struct TMSG_HEADER { char cMsgID; // 消息标识 TMSG_HEADER(char MsgID = INVALID_MSG) : cMsgID(MsgID) { } }; // 请求传送的文件名 // 客户端传给服务器端的是全路径名称 // 服务器传回给客户端的是文件名 struct TMSG_FILENAME : public TMSG_HEADER { char szFileName[256]; // 保存文件名的字符数组 TMSG_FILENAME() : TMSG_HEADER(MSG_FILENAME) { } }; // 传送文件长度 struct TMSG_FILELENGTH : public TMSG_HEADER { long lLength; TMSG_FILELENGTH(long length) : TMSG_HEADER(MSG_FILELENGTH), lLength(length) { } }; // Client端已经准备好了,要求Server端开始传送文件 struct TMSG_CLIENT_READY : public TMSG_HEADER { TMSG_CLIENT_READY() : TMSG_HEADER(MSG_CLIENT_READY) { } }; // 传送文件 struct TMSG_FILE : public TMSG_HEADER { union // 采用union保证了数据包的大小不大于MAX_PACKET_SIZE * sizeof(char) { char szBuff[MAX_PACKET_SIZE]; struct { int nStart; int nSize; char szBuff[MAX_PACKET_SIZE – 2 * sizeof(int)]; }tFile; }; TMSG_FILE() : TMSG_HEADER(MSG_FILE) { } }; // 传送文件成功 struct TMSG_SENDFILESUCCESS : public TMSG_HEADER { TMSG_SENDFILESUCCESS() : TMSG_HEADER(MSG_SENDFILESUCCESS) { } }; // 传送出错信息,包括: // MSG_OPENFILE_ERROR:打开文件失败 // MSG_FILEALREADYEXIT_ERROR:要保存的文件已经存在了 struct TMSG_ERROR_MSG : public TMSG_HEADER { TMSG_ERROR_MSG(char cErrorMsg) : TMSG_HEADER(cErrorMsg) { } }; #pragma pack() }; #endif /*server.h*/ #pragma comment(lib, "WS2_32") #include #include //#include #include #ifndef COMMONDEF_H #define COMMONDEF_H #define MAX_PACKET_SIZE 10240 // 数据包的最大长度,单位是sizeof(char) #define MAXFILEDIRLENGTH 256 // 存放文件路径的最大长度 #define PORT 4096 // 端口号 #define SERVER_IP "127.0.0.1" // server端的IP地址 // 各种消息的宏定义 #define INVALID_MSG -1 // 无效的消息标识 #define MSG_FILENAME 1 // 文件的名称 #define MSG_FILELENGTH 2 // 传送文件的长度 #define MSG_CLIENT_READY 3 // 客户端准备接收文件 #define MSG_FILE 4 // 传送文件 #define MSG_SENDFILESUCCESS 5 // 传送文件成功 #define MSG_OPENFILE_ERROR 10 // 打开文件失败,可能是文件路径错误找不到文件等原因 #define MSG_FILEALREADYEXIT_ERROR 11 // 要保存的文件已经存在了 class CCSDef { public: #pragma pack(1) // 使结构体的数据按照1字节来对齐,省空间 // 消息头 struct TMSG_HEADER { char cMsgID; // 消息标识 TMSG_HEADER(char MsgID = INVALID_MSG) : cMsgID(MsgID) { } }; // 请求传送的文件名 // 客户端传给服务器端的是全路径名称 // 服务器传回给客户端的是文件名 struct TMSG_FILENAME : public TMSG_HEADER { char szFileName[256]; // 保存文件名的字符数组 TMSG_FILENAME() : TMSG_HEADER(MSG_FILENAME) { } }; // 传送文件长度 struct TMSG_FILELENGTH : public TMSG_HEADER { long lLength; TMSG_FILELENGTH(long length) : TMSG_HEADER(MSG_FILELENGTH), lLength(length) { } }; // Client端已经准备好了,要求Server端开始传送文件 struct TMSG_CLIENT_READY : public TMSG_HEADER { TMSG_CLIENT_READY() : TMSG_HEADER(MSG_CLIENT_READY) { } }; // 传送文件 struct TMSG_FILE : public TMSG_HEADER { union // 采用union保证了数据包的大小不大于MAX_PACKET_SIZE * sizeof(char) { char szBuff[MAX_PACKET_SIZE]; struct { int nStart; int nSize; char szBuff[MAX_PACKET_SIZE – 2 * sizeof(int)]; }tFile; }; TMSG_FILE() : TMSG_HEADER(MSG_FILE) { } }; // 传送文件成功 struct TMSG_SENDFILESUCCESS : public TMSG_HEADER { TMSG_SENDFILESUCCESS() : TMSG_HEADER(MSG_SENDFILESUCCESS) { } }; // 传送出错信息,包括: // MSG_OPENFILE_ERROR:打开文件失败 // MSG_FILEALREADYEXIT_ERROR:要保存的文件已经存在了 struct TMSG_ERROR_MSG : public TMSG_HEADER { TMSG_ERROR_MSG(char cErrorMsg) : TMSG_HEADER(cErrorMsg) { } }; #pragma pack() }; #endif/*server.cpp*/ #include "server.h" char g_szNewFileName[MAXFILEDIRLENGTH]; char g_szBuff[MAX_PACKET_SIZE + 1]; long g_lLength; char* g_pBuff = NULL; // 初始化socket库 bool InitSocket(); // 关闭socket库 bool CloseSocket(); // 解析消息进行相应的处理 bool ProcessMsg(SOCKET sClient); // 监听Client的消息 void ListenToClient(); // 打开文件 bool OpenFile(CCSDef::TMSG_HEADER* pMsgHeader, SOCKET sClient); // 传送文件 bool SendFile(SOCKET sClient); // 读取文件进入缓冲区 bool ReadFile(SOCKET sClient); int main() { InitSocket(); ListenToClient(); CloseSocket(); return 0; } void ListenToClient() { // 创建socket套接字 SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (SOCKET_ERROR == sListen) { printf("Init Socket Error!\n"); return; } // 绑定socket到一个本地地址 sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(PORT); sin.sin_addr.S_un.S_addr = INADDR_ANY; if (::bind(sListen, (LPSOCKADDR)&sin, sizeof(sockaddr_in)) == SOCKET_ERROR) { printf("Bind Error!\n"); return; } // 设置socket进入监听状态 if (::listen(sListen, 10) == SOCKET_ERROR) { printf("Listen Error!\n"); return; } printf("Listening To Client…\n"); // 循环接收client端的连接请求 sockaddr_in ClientAddr; int nAddrLen = sizeof(sockaddr_in); SOCKET sClient; while (INVALID_SOCKET == (sClient = ::accept(sListen, (sockaddr*)&ClientAddr, &nAddrLen))) { } while (true == ProcessMsg(sClient)) { } // 关闭同客户端的连接 ::closesocket(sClient); ::closesocket(sListen); } bool InitSocket() { // 初始化socket dll WSADATA wsaData; WORD socketVersion = MAKEWORD(2, 2); if (::WSAStartup(socketVersion, &wsaData) != 0) { printf("Init socket dll error\n"); return false; } return true; } bool CloseSocket() { // 释放winsock库 ::WSACleanup(); if (NULL != g_pBuff) { delete [] g_pBuff; g_pBuff = NULL; } return true; } bool ProcessMsg(SOCKET sClient) { int nRecv = ::recv(sClient, g_szBuff, MAX_PACKET_SIZE + 1, 0); if (nRecv > 0) { g_szBuff[nRecv] = '\0'; } // 解析命令 CCSDef::TMSG_HEADER* pMsgHeader = (CCSDef::TMSG_HEADER*)g_szBuff; switch (pMsgHeader->cMsgID) { case MSG_FILENAME: // 文件名 { OpenFile(pMsgHeader, sClient); } break; case MSG_CLIENT_READY: // 客户端准备好了,开始传送文件 { SendFile(sClient); } break; case MSG_SENDFILESUCCESS: // 传送文件成功 { printf("Send File Success!\n"); return false; } break; case MSG_FILEALREADYEXIT_ERROR: // 要保存的文件已经存在了 { printf("The file reay to send already exit!\n"); return false; } break; } return true; } bool ReadFile(SOCKET sClient) { if (NULL != g_pBuff) { return true; } // 打开文件 FILE *pFile; if (NULL == (pFile = fopen(g_szNewFileName, "rb"))) // 打开文件失败 { printf("Cannot find the file, request the client input file name again\n"); CCSDef::TMSG_ERROR_MSG tMsgErrorMsg(MSG_OPENFILE_ERROR); ::send(sClient, (char*)(&tMsgErrorMsg), sizeof(CCSDef::TMSG_ERROR_MSG), 0); return false; } // 把文件的长度传回到client去 fseek(pFile, 0, SEEK_END); g_lLength = ftell(pFile); printf("File Length = %d\n", g_lLength); CCSDef::TMSG_FILELENGTH tMsgFileLength(g_lLength); ::send(sClient, (char*)(&tMsgFileLength), sizeof(CCSDef::TMSG_FILELENGTH), 0); // 处理文件全路径名,把文件名分解出来 char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFname[_MAX_FNAME], szExt[_MAX_EXT]; _splitpath(g_szNewFileName, szDrive, szDir, szFname, szExt); strcat(szFname,szExt); CCSDef::TMSG_FILENAME tMsgFileName; strcpy(tMsgFileName.szFileName, szFname); printf("Send File Name: %s\n", tMsgFileName.szFileName); ::send(sClient, (char*)(&tMsgFileName), sizeof(CCSDef::TMSG_FILENAME), 0); // 分配缓冲区读取文件内容 g_pBuff = new char[g_lLength + 1]; if (NULL == g_pBuff) { return false; }fseek(pFile, 0, SEEK_SET); fread(g_pBuff, sizeof(char), g_lLength, pFile); g_pBuff[g_lLength] = '\0'; fclose(pFile); return true; } // 打开文件 bool OpenFile(CCSDef::TMSG_HEADER* pMsgHeader, SOCKET sClient) { CCSDef::TMSG_FILENAME* pRequestFilenameMsg = (CCSDef::TMSG_FILENAME*)pMsgHeader; // 对文件路径名进行一些处理 char *p1, *p2; for (p1 = pRequestFilenameMsg->szFileName, p2 = g_szNewFileName; '\0' != *p1; ++p1, ++p2) { if ('\n' != *p1) { *p2 = *p1; } if ('\\' == *p2) { *(++p2) = '\\'; } } *p2 = '\0'; ReadFile(sClient); return true; } // 传送文件 bool SendFile(SOCKET sClient) { if (NULL == g_pBuff) { ReadFile(sClient); } int nPacketBufferSize = MAX_PACKET_SIZE – 2 * sizeof(int); // 每个数据包存放文件的buffer大小 // 如果文件的长度大于每个数据包所能传送的buffer长度那么就分块传送 for (int i = 0; i < g_lLength; i += nPacketBufferSize) { CCSDef::TMSG_FILE tMsgFile; tMsgFile.tFile.nStart = i; if (i + nPacketBufferSize + 1> g_lLength) { tMsgFile.tFile.nSize = g_lLength – i; } else { tMsgFile.tFile.nSize = nPacketBufferSize; } //printf("start = %d, size = %d\n", tMsgFile.tFile.nStart, tMsgFile.tFile.nSize); memcpy(tMsgFile.tFile.szBuff, g_pBuff + tMsgFile.tFile.nStart, tMsgFile.tFile.nSize); ::send(sClient, (char*)(&tMsgFile), sizeof(CCSDef::TMSG_FILE), 0); Sleep(0.5); } delete [] g_pBuff; g_pBuff = NULL; return true; } /*client.h同server.h*/ /*client.cpp*/ #include "client.h" long g_lLength = 0; char* g_pBuff = NULL; char g_szFileName[MAXFILEDIRLENGTH]; char g_szBuff[MAX_PACKET_SIZE + 1]; SOCKET g_sClient; // 初始化socket库 bool InitSocket(); // 关闭socket库 bool CloseSocket(); // 把用户输入的文件路径传送到server端 bool SendFileNameToServer(); // 与server端连接 bool ConectToServer(); // 打开文件失败 bool OpenFileError(CCSDef::TMSG_HEADER *pMsgHeader); // 分配空间以便写入文件 bool AllocateMemoryForFile(CCSDef::TMSG_HEADER *pMsgHeader); // 写入文件 bool WriteToFile(CCSDef::TMSG_HEADER *pMsgHeader); // 处理server端传送过来的消息 bool ProcessMsg(); int main() { InitSocket(); ConectToServer(); CloseSocket(); return 0; } // 初始化socket库 bool InitSocket() { // 初始化socket dll WSADATA wsaData; WORD socketVersion = MAKEWORD(2, 2); if (::WSAStartup(socketVersion, &wsaData) != 0) { printf("Init socket dll error\n"); exit(-1); } return true; } // 关闭socket库 bool CloseSocket() { // 关闭套接字 ::closesocket(g_sClient); // 释放winsock库 ::WSACleanup(); return true; } // 与server端连接进行文件的传输 bool ConectToServer() { // 初始化socket套接字 if (SOCKET_ERROR == (g_sClient = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))) { printf("Init Socket Error!\n"); exit(-1); } sockaddr_in servAddr; servAddr.sin_family = AF_INET; servAddr.sin_port = htons(PORT); servAddr.sin_addr.S_un.S_addr = ::inet_addr(SERVER_IP); if (INVALID_SOCKET == (::connect(g_sClient, (sockaddr*)&servAddr, sizeof(sockaddr_in)))) { printf("Connect to Server Error!\n"); exit(-1); } // 输入文件路径传输到server端 SendFileNameToServer(); // 接收server端传过来的信息,直到保存文件成功为止 while (true == ProcessMsg()) { } return true; } // 把用户输入的文件路径传送到server端 bool SendFileNameToServer() { char szFileName[MAXFILEDIRLENGTH]; printf("Input the File Directory: "); fgets(szFileName, MAXFILEDIRLENGTH, stdin); // 把文件路径发到server端 CCSDef::TMSG_FILENAME tMsgRequestFileName; strcpy(tMsgRequestFileName.szFileName, szFileName); if (SOCKET_ERROR == ::send(g_sClient, (char*)(&tMsgRequestFileName), sizeof(CCSDef::TMSG_FILENAME), 0)) { printf("Send File Name Error!\n"); exit(-1); } return true; } // 处理server端传送过来的消息 bool ProcessMsg() { CCSDef::TMSG_HEADER *pMsgHeader; int nRecv = ::recv(g_sClient, g_szBuff, MAX_PACKET_SIZE + 1, 0); pMsgHeader = (CCSDef::TMSG_HEADER*)g_szBuff; switch (pMsgHeader->cMsgID) { case MSG_OPENFILE_ERROR: // 打开文件错误 { OpenFileError(pMsgHeader); } break; case MSG_FILELENGTH: // 文件的长度 { if (0 == g_lLength) { g_lLength = ((CCSDef::TMSG_FILELENGTH*)pMsgHeader)->lLength; printf("File Length: %d\n", g_lLength); } } break; case MSG_FILENAME: // 文件名 { return AllocateMemoryForFile(pMsgHeader); } break; case MSG_FILE: // 传送文件,写入文件成功之后退出这个函数 { if (WriteToFile(pMsgHeader)) { return false; } } break; } return true; } // 打开文件失败 bool OpenFileError(CCSDef::TMSG_HEADER *pMsgHeader) { if (NULL != g_pBuff) return true; assert(NULL != pMsgHeader); printf("Cannot find file!Please input again!\n"); // 重新输入文件名称 SendFileNameToServer(); return true; } // 查找是否已经存在了要保存的文件,同时分配缓冲区保存文件 bool AllocateMemoryForFile(CCSDef::TMSG_HEADER *pMsgHeader) { assert(NULL != pMsgHeader); if (NULL != g_pBuff) { return true; } CCSDef::TMSG_FILENAME* pRequestFilenameMsg = (CCSDef::TMSG_FILENAME*)pMsgHeader; printf("File Name: %s\n", pRequestFilenameMsg->szFileName); // 把文件的路径设置为C盘根目录下 strcpy(g_szFileName, "c:\\"); strcat(g_szFileName, pRequestFilenameMsg->szFileName); // 查找相同文件名的文件是否已经存在,如果存在报错退出 FILE* pFile; if (NULL != (pFile = fopen(g_szFileName, "r"))) { // 文件已经存在,要求重新输入一个文件 printf("The file already exist!\n"); CCSDef::TMSG_ERROR_MSG tMsgErrorMsg(MSG_FILEALREADYEXIT_ERROR); ::send(g_sClient, (char*)(&tMsgErrorMsg), sizeof(CCSDef::TMSG_ERROR_MSG), 0); fclose(pFile); return false; } // 分配缓冲区开始接收文件,如果分配成功就给server端发送开始传送文件的要求 g_pBuff = new char[g_lLength + 1]; if (NULL != g_pBuff) { memset(g_pBuff, '\0', g_lLength + 1); printf("Now ready to get the file %s!\n", pRequestFilenameMsg->szFileName); CCSDef::TMSG_CLIENT_READY tMsgClientReady; if (SOCKET_ERROR == ::send(g_sClient, (char*)(&tMsgClientReady), sizeof(CCSDef::TMSG_CLIENT_READY), 0)) { printf("Send Error!\n"); exit(-1); } } else { printf("Alloc memory for file error!\n"); exit(-1); } return true; } // 写入文件 bool WriteToFile(CCSDef::TMSG_HEADER *pMsgHeader) { assert(NULL != pMsgHeader); CCSDef::TMSG_FILE* pMsgFile = (CCSDef::TMSG_FILE*)pMsgHeader; int nStart = pMsgFile->tFile.nStart; int nSize = pMsgFile->tFile.nSize; memcpy(g_pBuff + nStart, pMsgFile->tFile.szBuff, nSize); if (0 == nStart) { printf("Saving file into buffer…\n"); } memcpy(g_pBuff + nStart, pMsgFile->tFile.szBuff, nSize); //printf("start = %d, size = %d\n", nStart, nSize); // 如果已经保存到缓冲区完毕就写入文件 if (nStart + nSize >= g_lLength) { printf("Writing to disk….\n"); // 写入文件 FILE* pFile; pFile = fopen(g_szFileName, "w+b"); fwrite(g_pBuff, sizeof(char), g_lLength, pFile); delete [] g_pBuff; g_pBuff = NULL; fclose(pFile); // 保存文件成功传送消息给server退出server CCSDef::TMSG_SENDFILESUCCESS tMsgSendFileSuccess; while (SOCKET_ERROR == ::send(g_sClient, (char*)(&tMsgSendFileSuccess), sizeof(CCSDef::TMSG_SENDFILESUCCESS), 0)) { } printf("Save the file %s success!\n", g_szFileName); return true; } else { return false; } }

㈥ 想做一个文件传输软件,选择用什么协议比较好呢

我觉得用FTP比较好,兼容性高,速度也快,搭建成本也不高,又能通用,虽然功能不多,但可以以自定义,企业的话用NFS也比较好。

㈦ c#怎么做文件传输软件

需要用到网络编程模块,使用UDP或者TCP协议编写Socket,打开客户端,一个写入,一个读取

㈧ 利用Socket API接口设计一个文件传输软件,并编程实现,可以自定义文件传输的通信。

我粘贴别人的 你自己看看吧 我看不懂 你自己解决把代码如下://功能:利用SOCKET传送文件的代码/*server.h*/ #pragma comment(lib, "WS2_32") #include #include //#include #include #ifndef COMMONDEF_H #define COMMONDEF_H #define MAX_PACKET_SIZE 10240 // 数据包的最大长度,单位是sizeof(char) #define MAXFILEDIRLENGTH 256 // 存放文件路径的最大长度 #define PORT 4096 // 端口号 #define SERVER_IP "127.0.0.1" // server端的IP地址 // 各种消息的宏定义 #define INVALID_MSG -1 // 无效的消息标识 #define MSG_FILENAME 1 // 文件的名称 #define MSG_FILELENGTH 2 // 传送文件的长度 #define MSG_CLIENT_READY 3 // 客户端准备接收文件 #define MSG_FILE 4 // 传送文件 #define MSG_SENDFILESUCCESS 5 // 传送文件成功 #define MSG_OPENFILE_ERROR 10 // 打开文件失败,可能是文件路径错误找不到文件等原因 #define MSG_FILEALREADYEXIT_ERROR 11 // 要保存的文件已经存在了 class CCSDef { public: #pragma pack(1) // 使结构体的数据按照1字节来对齐,省空间 // 消息头 struct TMSG_HEADER { char cMsgID; // 消息标识 TMSG_HEADER(char MsgID = INVALID_MSG) : cMsgID(MsgID) { } }; // 请求传送的文件名 // 客户端传给服务器端的是全路径名称 // 服务器传回给客户端的是文件名 struct TMSG_FILENAME : public TMSG_HEADER { char szFileName[256]; // 保存文件名的字符数组 TMSG_FILENAME() : TMSG_HEADER(MSG_FILENAME) { } }; // 传送文件长度 struct TMSG_FILELENGTH : public TMSG_HEADER { long lLength; TMSG_FILELENGTH(long length) : TMSG_HEADER(MSG_FILELENGTH), lLength(length) { } }; // Client端已经准备好了,要求Server端开始传送文件 struct TMSG_CLIENT_READY : public TMSG_HEADER { TMSG_CLIENT_READY() : TMSG_HEADER(MSG_CLIENT_READY) { } }; // 传送文件 struct TMSG_FILE : public TMSG_HEADER { union // 采用union保证了数据包的大小不大于MAX_PACKET_SIZE * sizeof(char) { char szBuff[MAX_PACKET_SIZE]; struct { int nStart; int nSize; char szBuff[MAX_PACKET_SIZE – 2 * sizeof(int)]; }tFile; }; TMSG_FILE() : TMSG_HEADER(MSG_FILE) { } }; // 传送文件成功 struct TMSG_SENDFILESUCCESS : public TMSG_HEADER { TMSG_SENDFILESUCCESS() : TMSG_HEADER(MSG_SENDFILESUCCESS) { } }; // 传送出错信息,包括: // MSG_OPENFILE_ERROR:打开文件失败 // MSG_FILEALREADYEXIT_ERROR:要保存的文件已经存在了 struct TMSG_ERROR_MSG : public TMSG_HEADER { TMSG_ERROR_MSG(char cErrorMsg) : TMSG_HEADER(cErrorMsg) { } }; #pragma pack() }; #endif /*server.h*/ #pragma comment(lib, "WS2_32") #include #include //#include #include #ifndef COMMONDEF_H #define COMMONDEF_H #define MAX_PACKET_SIZE 10240 // 数据包的最大长度,单位是sizeof(char) #define MAXFILEDIRLENGTH 256 // 存放文件路径的最大长度 #define PORT 4096 // 端口号 #define SERVER_IP "127.0.0.1" // server端的IP地址 // 各种消息的宏定义 #define INVALID_MSG -1 // 无效的消息标识 #define MSG_FILENAME 1 // 文件的名称 #define MSG_FILELENGTH 2 // 传送文件的长度 #define MSG_CLIENT_READY 3 // 客户端准备接收文件 #define MSG_FILE 4 // 传送文件 #define MSG_SENDFILESUCCESS 5 // 传送文件成功 #define MSG_OPENFILE_ERROR 10 // 打开文件失败,可能是文件路径错误找不到文件等原因 #define MSG_FILEALREADYEXIT_ERROR 11 // 要保存的文件已经存在了 class CCSDef { public: #pragma pack(1) // 使结构体的数据按照1字节来对齐,省空间 // 消息头 struct TMSG_HEADER { char cMsgID; // 消息标识 TMSG_HEADER(char MsgID = INVALID_MSG) : cMsgID(MsgID) { } }; // 请求传送的文件名 // 客户端传给服务器端的是全路径名称 // 服务器传回给客户端的是文件名 struct TMSG_FILENAME : public TMSG_HEADER { char szFileName[256]; // 保存文件名的字符数组 TMSG_FILENAME() : TMSG_HEADER(MSG_FILENAME) { } }; // 传送文件长度 struct TMSG_FILELENGTH : public TMSG_HEADER { long lLength; TMSG_FILELENGTH(long length) : TMSG_HEADER(MSG_FILELENGTH), lLength(length) { } }; // Client端已经准备好了,要求Server端开始传送文件 struct TMSG_CLIENT_READY : public TMSG_HEADER { TMSG_CLIENT_READY() : TMSG_HEADER(MSG_CLIENT_READY) { } }; // 传送文件 struct TMSG_FILE : public TMSG_HEADER { union // 采用union保证了数据包的大小不大于MAX_PACKET_SIZE * sizeof(char) { char szBuff[MAX_PACKET_SIZE]; struct { int nStart; int nSize; char szBuff[MAX_PACKET_SIZE – 2 * sizeof(int)]; }tFile; }; TMSG_FILE() : TMSG_HEADER(MSG_FILE) { } }; // 传送文件成功 struct TMSG_SENDFILESUCCESS : public TMSG_HEADER { TMSG_SENDFILESUCCESS() : TMSG_HEADER(MSG_SENDFILESUCCESS) { } }; // 传送出错信息,包括: // MSG_OPENFILE_ERROR:打开文件失败 // MSG_FILEALREADYEXIT_ERROR:要保存的文件已经存在了 struct TMSG_ERROR_MSG : public TMSG_HEADER { TMSG_ERROR_MSG(char cErrorMsg) : TMSG_HEADER(cErrorMsg) { } }; #pragma pack() }; #endif/*server.cpp*/ #include "server.h" char g_szNewFileName[MAXFILEDIRLENGTH]; char g_szBuff[MAX_PACKET_SIZE + 1]; long g_lLength; char* g_pBuff = NULL; // 初始化socket库 bool InitSocket(); // 关闭socket库 bool CloseSocket(); // 解析消息进行相应的处理 bool ProcessMsg(SOCKET sClient); // 监听Client的消息 void ListenToClient(); // 打开文件 bool OpenFile(CCSDef::TMSG_HEADER* pMsgHeader, SOCKET sClient); // 传送文件 bool SendFile(SOCKET sClient); // 读取文件进入缓冲区 bool ReadFile(SOCKET sClient); int main() { InitSocket(); ListenToClient(); CloseSocket(); return 0; } void ListenToClient() { // 创建socket套接字 SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (SOCKET_ERROR == sListen) { printf("Init Socket Error!\n"); return; } // 绑定socket到一个本地地址 sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(PORT); sin.sin_addr.S_un.S_addr = INADDR_ANY; if (::bind(sListen, (LPSOCKADDR)&sin, sizeof(sockaddr_in)) == SOCKET_ERROR) { printf("Bind Error!\n"); return; } // 设置socket进入监听状态 if (::listen(sListen, 10) == SOCKET_ERROR) { printf("Listen Error!\n"); return; } printf("Listening To Client…\n"); // 循环接收client端的连接请求 sockaddr_in ClientAddr; int nAddrLen = sizeof(sockaddr_in); SOCKET sClient; while (INVALID_SOCKET == (sClient = ::accept(sListen, (sockaddr*)&ClientAddr, &nAddrLen))) { } while (true == ProcessMsg(sClient)) { } // 关闭同客户端的连接 ::closesocket(sClient); ::closesocket(sListen); } bool InitSocket() { // 初始化socket dll WSADATA wsaData; WORD socketVersion = MAKEWORD(2, 2); if (::WSAStartup(socketVersion, &wsaData) != 0) { printf("Init socket dll error\n"); return false; } return true; } bool CloseSocket() { // 释放winsock库 ::WSACleanup(); if (NULL != g_pBuff) { delete [] g_pBuff; g_pBuff = NULL; } return true; } bool ProcessMsg(SOCKET sClient) { int nRecv = ::recv(sClient, g_szBuff, MAX_PACKET_SIZE + 1, 0); if (nRecv > 0) { g_szBuff[nRecv] = '\0'; } // 解析命令 CCSDef::TMSG_HEADER* pMsgHeader = (CCSDef::TMSG_HEADER*)g_szBuff; switch (pMsgHeader->cMsgID) { case MSG_FILENAME: // 文件名 { OpenFile(pMsgHeader, sClient); } break; case MSG_CLIENT_READY: // 客户端准备好了,开始传送文件 { SendFile(sClient); } break; case MSG_SENDFILESUCCESS: // 传送文件成功 { printf("Send File Success!\n"); return false; } break; case MSG_FILEALREADYEXIT_ERROR: // 要保存的文件已经存在了 { printf("The file reay to send already exit!\n"); return false; } break; } return true; } bool ReadFile(SOCKET sClient) { if (NULL != g_pBuff) { return true; } // 打开文件 FILE *pFile; if (NULL == (pFile = fopen(g_szNewFileName, "rb"))) // 打开文件失败 { printf("Cannot find the file, request the client input file name again\n"); CCSDef::TMSG_ERROR_MSG tMsgErrorMsg(MSG_OPENFILE_ERROR); ::send(sClient, (char*)(&tMsgErrorMsg), sizeof(CCSDef::TMSG_ERROR_MSG), 0); return false; } // 把文件的长度传回到client去 fseek(pFile, 0, SEEK_END); g_lLength = ftell(pFile); printf("File Length = %d\n", g_lLength); CCSDef::TMSG_FILELENGTH tMsgFileLength(g_lLength); ::send(sClient, (char*)(&tMsgFileLength), sizeof(CCSDef::TMSG_FILELENGTH), 0); // 处理文件全路径名,把文件名分解出来 char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFname[_MAX_FNAME], szExt[_MAX_EXT]; _splitpath(g_szNewFileName, szDrive, szDir, szFname, szExt); strcat(szFname,szExt); CCSDef::TMSG_FILENAME tMsgFileName; strcpy(tMsgFileName.szFileName, szFname); printf("Send File Name: %s\n", tMsgFileName.szFileName); ::send(sClient, (char*)(&tMsgFileName), sizeof(CCSDef::TMSG_FILENAME), 0); // 分配缓冲区读取文件内容 g_pBuff = new char[g_lLength + 1]; if (NULL == g_pBuff) { return false; }fseek(pFile, 0, SEEK_SET); fread(g_pBuff, sizeof(char), g_lLength, pFile); g_pBuff[g_lLength] = '\0'; fclose(pFile); return true; } // 打开文件 bool OpenFile(CCSDef::TMSG_HEADER* pMsgHeader, SOCKET sClient) { CCSDef::TMSG_FILENAME* pRequestFilenameMsg = (CCSDef::TMSG_FILENAME*)pMsgHeader; // 对文件路径名进行一些处理 char *p1, *p2; for (p1 = pRequestFilenameMsg->szFileName, p2 = g_szNewFileName; '\0' != *p1; ++p1, ++p2) { if ('\n' != *p1) { *p2 = *p1; } if ('\\' == *p2) { *(++p2) = '\\'; } } *p2 = '\0'; ReadFile(sClient); return true; } // 传送文件 bool SendFile(SOCKET sClient) { if (NULL == g_pBuff) { ReadFile(sClient); } int nPacketBufferSize = MAX_PACKET_SIZE – 2 * sizeof(int); // 每个数据包存放文件的buffer大小 // 如果文件的长度大于每个数据包所能传送的buffer长度那么就分块传送 for (int i = 0; i < g_lLength; i += nPacketBufferSize) { CCSDef::TMSG_FILE tMsgFile; tMsgFile.tFile.nStart = i; if (i + nPacketBufferSize + 1> g_lLength) { tMsgFile.tFile.nSize = g_lLength – i; } else { tMsgFile.tFile.nSize = nPacketBufferSize; } //printf("start = %d, size = %d\n", tMsgFile.tFile.nStart, tMsgFile.tFile.nSize); memcpy(tMsgFile.tFile.szBuff, g_pBuff + tMsgFile.tFile.nStart, tMsgFile.tFile.nSize); ::send(sClient, (char*)(&tMsgFile), sizeof(CCSDef::TMSG_FILE), 0); Sleep(0.5); } delete [] g_pBuff; g_pBuff = NULL; return true; } /*client.h同server.h*/ /*client.cpp*/ #include "client.h" long g_lLength = 0; char* g_pBuff = NULL; char g_szFileName[MAXFILEDIRLENGTH]; char g_szBuff[MAX_PACKET_SIZE + 1]; SOCKET g_sClient; // 初始化socket库 bool InitSocket(); // 关闭socket库 bool CloseSocket(); // 把用户输入的文件路径传送到server端 bool SendFileNameToServer(); // 与server端连接 bool ConectToServer(); // 打开文件失败 bool OpenFileError(CCSDef::TMSG_HEADER *pMsgHeader); // 分配空间以便写入文件 bool AllocateMemoryForFile(CCSDef::TMSG_HEADER *pMsgHeader); // 写入文件 bool WriteToFile(CCSDef::TMSG_HEADER *pMsgHeader); // 处理server端传送过来的消息 bool ProcessMsg(); int main() { InitSocket(); ConectToServer(); CloseSocket(); return 0; } // 初始化socket库 bool InitSocket() { // 初始化socket dll WSADATA wsaData; WORD socketVersion = MAKEWORD(2, 2); if (::WSAStartup(socketVersion, &wsaData) != 0) { printf("Init socket dll error\n"); exit(-1); } return true; } // 关闭socket库 bool CloseSocket() { // 关闭套接字 ::closesocket(g_sClient); // 释放winsock库 ::WSACleanup(); return true; } // 与server端连接进行文件的传输 bool ConectToServer() { // 初始化socket套接字 if (SOCKET_ERROR == (g_sClient = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))) { printf("Init Socket Error!\n"); exit(-1); } sockaddr_in servAddr; servAddr.sin_family = AF_INET; servAddr.sin_port = htons(PORT); servAddr.sin_addr.S_un.S_addr = ::inet_addr(SERVER_IP); if (INVALID_SOCKET == (::connect(g_sClient, (sockaddr*)&servAddr, sizeof(sockaddr_in)))) { printf("Connect to Server Error!\n"); exit(-1); } // 输入文件路径传输到server端 SendFileNameToServer(); // 接收server端传过来的信息,直到保存文件成功为止 while (true == ProcessMsg()) { } return true; } // 把用户输入的文件路径传送到server端 bool SendFileNameToServer() { char szFileName[MAXFILEDIRLENGTH]; printf("Input the File Directory: "); fgets(szFileName, MAXFILEDIRLENGTH, stdin); // 把文件路径发到server端 CCSDef::TMSG_FILENAME tMsgRequestFileName; strcpy(tMsgRequestFileName.szFileName, szFileName); if (SOCKET_ERROR == ::send(g_sClient, (char*)(&tMsgRequestFileName), sizeof(CCSDef::TMSG_FILENAME), 0)) { printf("Send File Name Error!\n"); exit(-1); } return true; } // 处理server端传送过来的消息 bool ProcessMsg() { CCSDef::TMSG_HEADER *pMsgHeader; int nRecv = ::recv(g_sClient, g_szBuff, MAX_PACKET_SIZE + 1, 0); pMsgHeader = (CCSDef::TMSG_HEADER*)g_szBuff; switch (pMsgHeader->cMsgID) { case MSG_OPENFILE_ERROR: // 打开文件错误 { OpenFileError(pMsgHeader); } break; case MSG_FILELENGTH: // 文件的长度 { if (0 == g_lLength) { g_lLength = ((CCSDef::TMSG_FILELENGTH*)pMsgHeader)->lLength; printf("File Length: %d\n", g_lLength); } } break; case MSG_FILENAME: // 文件名 { return AllocateMemoryForFile(pMsgHeader); } break; case MSG_FILE: // 传送文件,写入文件成功之后退出这个函数 { if (WriteToFile(pMsgHeader)) { return false; } } break; } return true; } // 打开文件失败 bool OpenFileError(CCSDef::TMSG_HEADER *pMsgHeader) { if (NULL != g_pBuff) return true; assert(NULL != pMsgHeader); printf("Cannot find file!Please input again!\n"); // 重新输入文件名称 SendFileNameToServer(); return true; } // 查找是否已经存在了要保存的文件,同时分配缓冲区保存文件 bool AllocateMemoryForFile(CCSDef::TMSG_HEADER *pMsgHeader) { assert(NULL != pMsgHeader); if (NULL != g_pBuff) { return true; } CCSDef::TMSG_FILENAME* pRequestFilenameMsg = (CCSDef::TMSG_FILENAME*)pMsgHeader; printf("File Name: %s\n", pRequestFilenameMsg->szFileName); // 把文件的路径设置为C盘根目录下 strcpy(g_szFileName, "c:\\"); strcat(g_szFileName, pRequestFilenameMsg->szFileName); // 查找相同文件名的文件是否已经存在,如果存在报错退出 FILE* pFile; if (NULL != (pFile = fopen(g_szFileName, "r"))) { // 文件已经存在,要求重新输入一个文件 printf("The file already exist!\n"); CCSDef::TMSG_ERROR_MSG tMsgErrorMsg(MSG_FILEALREADYEXIT_ERROR); ::send(g_sClient, (char*)(&tMsgErrorMsg), sizeof(CCSDef::TMSG_ERROR_MSG), 0); fclose(pFile); return false; } // 分配缓冲区开始接收文件,如果分配成功就给server端发送开始传送文件的要求 g_pBuff = new char[g_lLength + 1]; if (NULL != g_pBuff) { memset(g_pBuff, '\0', g_lLength + 1); printf("Now ready to get the file %s!\n", pRequestFilenameMsg->szFileName); CCSDef::TMSG_CLIENT_READY tMsgClientReady; if (SOCKET_ERROR == ::send(g_sClient, (char*)(&tMsgClientReady), sizeof(CCSDef::TMSG_CLIENT_READY), 0)) { printf("Send Error!\n"); exit(-1); } } else { printf("Alloc memory for file error!\n"); exit(-1); } return true; } // 写入文件 bool WriteToFile(CCSDef::TMSG_HEADER *pMsgHeader) { assert(NULL != pMsgHeader); CCSDef::TMSG_FILE* pMsgFile = (CCSDef::TMSG_FILE*)pMsgHeader; int nStart = pMsgFile->tFile.nStart; int nSize = pMsgFile->tFile.nSize; memcpy(g_pBuff + nStart, pMsgFile->tFile.szBuff, nSize); if (0 == nStart) { printf("Saving file into buffer…\n"); } memcpy(g_pBuff + nStart, pMsgFile->tFile.szBuff, nSize); //printf("start = %d, size = %d\n", nStart, nSize); // 如果已经保存到缓冲区完毕就写入文件 if (nStart + nSize >= g_lLength) { printf("Writing to disk….\n"); // 写入文件 FILE* pFile; pFile = fopen(g_szFileName, "w+b"); fwrite(g_pBuff, sizeof(char), g_lLength, pFile); delete [] g_pBuff; g_pBuff = NULL; fclose(pFile); // 保存文件成功传送消息给server退出server CCSDef::TMSG_SENDFILESUCCESS tMsgSendFileSuccess; while (SOCKET_ERROR == ::send(g_sClient, (char*)(&tMsgSendFileSuccess), sizeof(CCSDef::TMSG_SENDFILESUCCESS), 0)) { } printf("Save the file %s success!\n", g_szFileName); return true; } else { return false; } }

㈨ 如何用Java编写一个在局域网传输文件的软件

最核心的想法,你拿到Socket 的输入输出流,再拿到 FileInputStream And FileOutputStream ,从FileInputStream 读取到的东西,写到Socket输出流中就实现了,文件传送,反过来你就可以实现接受了

未经允许不得转载:山九号 » 制作一个文件传输软件|如何做一个能将文件上传到局域网服务器的软件适用于ANDROID系统

赞 (0)