socket文件发送|用c++ socket怎么实现发送文件夹

⑴ 怎样用socket实现点对点的文件传输

在两台计算机传输文件之前,必需得先有一台计算机建立套接字连接并绑定一个固定得端口,并在这个端口侦听另外一台计算机的连接请求。socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);socket.Blocking = true ;IPEndPoint computernode1 = new IPEndPoint(serverIpadress, 8080);socket.Bind(computernode1);socket.Listen(-1);当有其他的计算机发出连接请求的时候,被请求的计算机将对每一个连接请求分配一个线程,用于处理文件传输和其他服务。while ( true ){clientsock = socket.Accept();if ( clientsock.Connected ){Thread tc = new Thread(new ThreadStart(listenclient));tc.Start();}}下面的代码展示了listenclient方法是如何处理另外一台计算机发送过来的请求。首先并对发送过来的请求字符串作出判断,看看是何种请求,然后决定相应的处理方法。void listenclient(){Socket sock = clientsock ;try{while ( sock != null ) {byte[] recs = new byte[32767];int rcount = sock.Receive(recs,recs.Length,0) ;string message = System.Text.Encoding.ASCII.GetString(recs) ;//对message作出处理,解析处请求字符和参数存储在cmdList 中execmd=cmdList[0];sender = null ;sender = new Byte[32767];string parm1 = "";//目录列举 if ( execmd == "LISTING" ) {ListFiles(message);continue ;} //文件传输if ( execmd == "GETOK" ){cmd = "BEGINSEND " + filepath + " " + filesize ;sender = new Byte[1024];sender = Encoding.ASCII.GetBytes(cmd);sock.Send(sender, sender.Length , 0 );//转到文件下载处理DownloadingFile(sock);continue ;} }}catch(Exception Se){string s = Se.Message;Console.WriteLine(s);}}至此,基本的工作已经完成了,下面我们看看如何处理文件传输的。while(rdby < total && nfs.CanWrite){//从要传输的文件读取指定长度的数据len =fin.Read(buffed,0,buffed.Length) ;//将读取的数据发送到对应的计算机nfs.Write(buffed, 0,len);//增加已经发送的长度rdby=rdby+len ; } 从上面的代码可以看出是完成文件转换成FileStream 流,然后通过NetworkStream绑定对应的套节子,最后调用他的write方法发送到对应的计算机。我们再看看接受端是如何接受传输过来的流,并且转换成文件的:NetworkStream nfs = new NetworkStream(sock) ;try{//一直循环直到指定的文件长度while(rby < size){byte[] buffer = new byte[1024] ;//读取发送过来的文件流int i = nfs.Read(buffer,0,buffer.Length) ;fout.Write(buffer,0,(int)i) ;rby=rby+i ;} fout.Close() ; 从上面可以看出接受与发送恰好是互为相反的过程,非常简单。至此,单方向的文件传输就完成了,只需要在每个对等的节点上同时实现上面的发送和接受的处理代码就可以做到互相传输文件了。

⑵ 如何通过Socket TCP发送并接收一个文件

一.小结1.大包发小包收,只发一次。2.发时把文件扩展名,文件长度也随同一起发送,方便接收端接收时另存为正确的文件类型,并判断是否已经接收完毕。如果不一起发送,分为文件扩展名,文件长度,文件内容,发送三次,在接收端,也可能会一起收到,反而不利于解析。二.客户发送端代码复制代码private void btnSend_Click(object sender, EventArgs e){//组合出远程终结点IPAddress ipAddress = IPAddress.Parse(this.txtIP3.Text);IPEndPoint hostEP = new IPEndPoint(ipAddress, Convert.ToInt32(this.txtPort3.Text));Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);try{socket.Connect(hostEP);//1.发送用户协议string path1 = Environment.CurrentDirectory; //获取应用程序的当前工作目录。string doc = "YourSendFile.pdf";string path = Path.Combine(path1, doc);FileStream fs = File.Open(path, FileMode.Open);//文件内容byte[] bdata = new byte[fs.Length];fs.Read(bdata, 0, bdata.Length);fs.Close();//文件扩展名,固定3字节byte[] fileExtArray = Encoding.UTF8.GetBytes(string.Format("{0:D3}", currentDocExt));//文件长度, 固定为20字节,前面会自动补零byte[] fileLengthArray = Encoding.UTF8.GetBytes(bdata.Length.ToString("D20"));//合并byte数组byte[] fileArray = CombomBinaryArray(fileExtArray, fileLengthArray);//合并byte数组byte[] bdata1 = CombomBinaryArray(fileArray, bdata);//发文件长度+文件内容socket.Send(bdata1, bdata1.Length, 0);//2.接收//声明接收返回内容的字符串string recvStr = "";//声明字节数组,一次接收数据的长度为 1024 字节byte[] recvBytes = new byte[1024];//返回实际接收内容的字节数int bytes = 0;//循环读取,直到接收完所有数据while (true){bytes = socket.Receive(recvBytes, recvBytes.Length, 0);//读取完成后退出循环if (bytes <= 0) break;//将读取的字节数转换为字符串recvStr += Encoding.UTF8.GetString(recvBytes, 0, bytes);}//禁用 Socketsocket.Shutdown(SocketShutdown.Both);//关闭 Socketsocket.Close();//… do some busness logic …}catch (Exception e1){throw e1;}}复制代码三.服务接收端代码复制代码using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net.Sockets;using System.Net;using System.Xml;using System.Configuration;using System.Windows.Forms;using System.IO;namespace ConsoleAppServer{class Program{[STAThread]static void Main(string[] args){bool Done = false;IPAddress ipAddress = IPAddress.Parse(ConfigurationSettings.AppSettings["IP"].ToString());IPEndPoint hostEP = new IPEndPoint(ipAddress, Convert.ToInt32(ConfigurationSettings.AppSettings["Port"]));Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);socket.Bind(hostEP);socket.Listen(3);while (!Done){Console.WriteLine("waiting for client");Socket client = socket.Accept();Console.WriteLine("connected client");//1.接收//声明字节数组,一次接收数据的长度为 1024 字节byte[] recvBytes = new byte[1024];//返回实际接收内容的字节数int bytes = 0;int FileLength = 0; // 900866;int ReceivedLength = 0;//1.0 接收文件扩展名bytes = client.Receive(recvBytes, 3, 0);string fileExt = Encoding.UTF8.GetString(recvBytes, 0, bytes);string vFilePath = Environment.CurrentDirectory;string vFileName = vFilePath + "\\Tmp" + Guid.NewGuid().ToString() + "." + fileExt;//创建文件流,然后让文件流来根据路径创建一个文件FileStream fs = new FileStream(vFileName, FileMode.Create);//1.1 接收文件长度bytes = client.Receive(recvBytes, 20, 0);//将读取的字节数转换为字符串string fileLength = Encoding.UTF8.GetString(recvBytes, 0, bytes);FileLength = Convert.ToInt32(fileLength);//1.2接收文件内容while (ReceivedLength < FileLength){bytes = client.Receive(recvBytes, recvBytes.Length, 0);ReceivedLength += bytes;fs.Write(recvBytes, 0, bytes);}fs.Flush();fs.Close();//… do some business logic …string returnData = SomeBusinessLogic();//2.发送byte[] bdata = Encoding.UTF8.GetBytes(returnData);client.Send(bdata, bdata.Length, 0);client.Close();}socket.Shutdown(SocketShutdown.Both);socket.Close();}}}

⑶ 请教socket文件传输问题

关闭?Receive最好开辟一个线程,来不断循环不断侦听每次发来的数据,你的Send传递的数据如果为二进制,最好分成两次传递,第一次传递二进制数据的长度,第二次传递数据,Receive接收的第一次数据得到二进制数据长度后,定义字节数组的长度,第二次向字节数组传递数据!你不是关闭,你是不是将传递与接收写在一起了?

⑷ 用c++ socket怎么实现发送文件夹

代码很长,如下:/*server.h*/#pragma comment(lib, "WS2_32")#include <WinSock2.h>#include <iostream>//#include <stdio.h>#include <assert.h>#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 dllWSADATA 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 dllWSADATA 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;}

⑸ 请问我怎样用socket发送一个文件

我想做一个程序,一个客户端,一个服务器段,两个通过socket发送和传递文件,我不知道能不能用sendstream或其他实现,我找不到例程,望赐教,定给分!定给分!定给分!定给分!定给分!

⑹ 要通过(socket)来传输文件这是什么意思

SOCKET用于在两个基于TCP/IP协议的应用程序之间相互通信。中文有的称为套接字,你可以理解为一个插座和插头,两者匹配才能进行数据通信。 SOCKET最早出现在UNIX系统中,是UNIX系统主要的信息传递方式。在WINDOWS系统中,SOCKET称为WINSOCK。SOCKET有两个基本概念:客户方和服务方。当两个应用之间需要采用SOCKET通信时,首先需要在两个应用之间(可能位于同一台机器,也可能位于不同的机器)建立SOCKET连接,发起呼叫连接请求的一方为客户方,接受呼叫连接请求的一方成为服务方。客户方和服务方是相对的,同一个应用可以是客户方,也可以是服务方。在客户方呼叫连接请求之前,它必须知道服务方在哪里。所以需要知道服务方所在机器的IP地址或机器名称,如果客户方和服务方事前有一个约定就好了,这个约定就是PORT(端口号)。也就是说,客户方可以通过服务方所在机器的IP地址或机器名称和端口号唯一的确定方式来呼叫服务方。在客户方呼叫之前,服务方必须处于侦听状态,侦听是否有客户要求建立连接。一旦接到连接请求,服务方可以根据情况建立或拒绝连接。连接方式有两种,同步方式(Blocking)和(noBlocking).客户方发送的消息可以是文本,也可以是二进制信息流。当客户方的消息到达服务方端口时,会自动触发一个事件(event),服务方只要接管该事件,就可以接受来自客户方的消息了。

⑺ socket 传送文件

此程序所占篇幅太大,涉及服务器和客户端两个程序。费时间了。主要思想就那么一点:基本socket编程,再加上文件操作不就行了。服务器端接到客户端发送的内容后,将缓冲区内的东西存到本地文件1.txt然后再将应答存储在2.txt文件中,同时将2.txt的内容发送回客户端。客户端接到后,将收到的东西存到客户端本地的2.txt中后,再向服务器发送应答。这东西的本质不是发送文件,而是接受信息并存储到本地的txt中,希望你理解

⑻ java socket传送文件

客户端代码如下:

importjava.io.DataOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.net.InetSocketAddress;importjava.net.Socket;/***文件发送客户端主程序*@authoradmin_Hzw**/publicclassBxClient{/***程序main方法*@paramargs*@throwsIOException*/publicstaticvoidmain(String[]args)throwsIOException{intlength=0;doublesumL=0;byte[]sendBytes=null;Socketsocket=null;DataOutputStreamdos=null;FileInputStreamfis=null;booleanbool=false;try{Filefile=newFile("D:/天啊.zip");//要传输的文件路径longl=file.length();socket=newSocket();socket.connect(newInetSocketAddress("127.0.0.1",48123));dos=newDataOutputStream(socket.getOutputStream());fis=newFileInputStream(file);sendBytes=newbyte[1024];while((length=fis.read(sendBytes,0,sendBytes.length))>0){sumL+=length;System.out.println("已传输:"+((sumL/l)*100)+"%");dos.write(sendBytes,0,length);dos.flush();}//虽然数据类型不同,但JAVA会自动转换成相同数据类型后在做比较if(sumL==l){bool=true;}}catch(Exceptione){System.out.println("客户端文件传输异常");bool=false;e.printStackTrace();}finally{if(dos!=null)dos.close();if(fis!=null)fis.close();if(socket!=null)socket.close();}System.out.println(bool?"成功":"失败");}}

服务端代码如下:

importjava.io.DataInputStream;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.net.ServerSocket;importjava.net.Socket;importjava.util.Random;importcom.boxun.util.GetDate;/***接收文件服务*@authoradmin_Hzw**/publicclassBxServerSocket{/***工程main方法*@paramargs*/publicstaticvoidmain(String[]args){try{finalServerSocketserver=newServerSocket(48123);Threadth=newThread(newRunnable(){publicvoidrun(){while(true){try{System.out.println("开始监听…");/**如果没有访问它会自动等待*/Socketsocket=server.accept();System.out.println("有链接");receiveFile(socket);}catch(Exceptione){System.out.println("服务器异常");e.printStackTrace();}}}});th.run();//启动线程运行}catch(Exceptione){e.printStackTrace();}}publicvoidrun(){}/***接收文件方法*@paramsocket*@throwsIOException*/publicstaticvoidreceiveFile(Socketsocket)throwsIOException{byte[]inputByte=null;intlength=0;DataInputStreamdis=null;FileOutputStreamfos=null;StringfilePath="D:/temp/"+GetDate.getDate()+"SJ"+newRandom().nextInt(10000)+".zip";try{try{dis=newDataInputStream(socket.getInputStream());Filef=newFile("D:/temp");if(!f.exists()){f.mkdir();}/**文件存储位置*/fos=newFileOutputStream(newFile(filePath));inputByte=newbyte[1024];System.out.println("开始接收数据…");while((length=dis.read(inputByte,0,inputByte.length))>0){fos.write(inputByte,0,length);fos.flush();}System.out.println("完成接收:"+filePath);}finally{if(fos!=null)fos.close();if(dis!=null)dis.close();if(socket!=null)socket.close();}}catch(Exceptione){e.printStackTrace();}}}

⑼ Socket通信能不能发送文件

当然可以咯,socket是套接字,运行在网络层(IP)以及传输层上,显然是可以传输文件的咯,应用层使用的各种TCP,FTP,UDP服务均可封装在套接字之上,所以显然是可以的咯。


赞 (0)