linux 下用socket 文件传输问题(UDP)
要下班了,时间急,不写代码了先给你一个思路 1 实现最简单的udp socket 模型,实现发送一个字符串。2 实现一个简单的打开文件,读取文件的例子,如用fgets(),类似的函数有很多,然后再把读取的文件内容忘另一个文件里写(相关函数fopen(),write(),read())。3 把上面两个函数结合到一起,在客户端实现打开要传送的文件,按一定的大小读取,读取后调用sendto()发送到服务器端。在服务器端创建一个文件,然后调用recvfrom()接受客户端发送过来的数据,向来是创建的那个文件中写。下面是改好的udp发送文件的例子。服务器端程序的编译gcc -o file_server file_server客户端程序的编译gcc -o file_client file_client.c服务器程序和客户端程应当分别运行在2台计算机上.服务器端程序的运行,在一个计算机的终端执行./file_server客户端程序的运行,在另一个计算机的终端中执行./file_client 运行服务器程序的计算机的IP地址根据提示输入要传输的服务器上的文件,该文件在服务器的运行目录上在实际编程和测试中,可以用2个终端代替2个计算机,这样就可以在一台计算机上测试网络程序,服务器端程序的运行,在一个终端执行./file_server客户端程序的运行,在另一个终端中执行./file_client 127.0.0.1说明: 任何计算机都可以通过127.0.0.1访问自己. 也可以用计算机的实际IP地址代替127.0.0.1//////////////////////////////////////////////////////////////////////////////////////// file_server.c 文件传输顺序服务器示例////////////////////////////////////////////////////////////////////////////////////////本文件是服务器的代码#include // for sockaddr_in#include // for socket#include // for socket#include // for printf#include // for exit#include // for bzero/*#include #include #include #include */#define HELLO_WORLD_SERVER_PORT 6666#define LENGTH_OF_LISTEN_QUEUE 20#define BUFFER_SIZE 1024#define FILE_NAME_MAX_SIZE 512int main(int argc, char **argv){//设置一个socket地址结构server_addr,代表服务器internet地址, 端口struct sockaddr_in server_addr, pcliaddr;bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htons(INADDR_ANY);server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);//创建用于internet的据报套接字(UDPt,用server_socket代表服务器socket// 创建数据报套接字(UDP)int server_socket = socket(PF_INET,SOCK_DGRAM,0);if( server_socket < 0){printf("Create Socket Failed!");exit(1);}//把socket和socket地址结构联系起来if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr))){printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);exit(1);}while (1) //服务器端要一直运行{//定义客户端的socket地址结构client_addrstruct sockaddr_in client_addr;socklen_t n = sizeof(client_addr) ;int length;char buffer[BUFFER_SIZE];bzero(buffer, BUFFER_SIZE);length = recvfrom(new_server_socket,buffer,BUFFER_SIZE,0,&pcliaddr,&n);if (length < 0){printf("Server Recieve Data Failed!n");break;}char file_name[FILE_NAME_MAX_SIZE+1];bzero(file_name, FILE_NAME_MAX_SIZE+1);strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));// int fp = open(file_name, O_RDONLY);// if( fp < 0 )FILE * fp = fopen(file_name,"r");if(NULL == fp ){printf("File:t%s Not Foundn", file_name);}else{bzero(buffer, BUFFER_SIZE);int file_block_length = 0;// while( (file_block_length = read(fp,buffer,BUFFER_SIZE))>0)while( (file_block_length = fread(buffer,sizeof(char),BUFFER_SIZE,fp))>0){printf("file_block_length = %dn",file_block_length);//发送buffer中的字符串到new_server_socket,实际是给客户端if(send(new_server_socket,buffer,file_block_length,0)<0){printf("Send File:t%s Failedn", file_name);break;}bzero(buffer, BUFFER_SIZE);}// close(fp);fclose(fp);printf("File:t%s Transfer Finishedn",file_name);}}}//////////////////////////////////////////////////////////////////////////////////////// file_client.c 文件传输客户端程序示例////////////////////////////////////////////////////////////////////////////////////////本文件是客户机的代码#include // for sockaddr_in#include // for socket#include // for socket#include // for printf#include // for exit#include // for bzero/*#include #include #include #include */#define HELLO_WORLD_SERVER_PORT 6666#define BUFFER_SIZE 1024#define FILE_NAME_MAX_SIZE 512int main(int argc, char **argv){if (argc != 2){printf("Usage: ./%s ServerIPAddressn",argv[0]);exit(1);}//设置一个socket地址结构client_addr,代表客户机internet地址, 端口struct sockaddr_in client_addr;bzero(&client_addr,sizeof(client_addr)); //把一段内存区的内容全部设置为0client_addr.sin_family = AF_INET; //internet协议族client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自动获取本机地址client_addr.sin_port = htons(0); //0表示让系统自动分配一个空闲端口//创建用于internet的流协议(TCP)socket,用client_socket代表客户机socketint client_socket = socket(AF_INET,SOCK_DGRAM,0);if( client_socket < 0){printf("Create Socket Failed!n");exit(1);}//设置一个socket地址结构server_addr,代表服务器的internet地址, 端口struct sockaddr_in server_addr;bzero(&server_addr,sizeof(server_addr));server_addr.sin_family = AF_INET;if(inet_aton(argv[1],&server_addr.sin_addr) == 0) //服务器的IP地址来自程序的参数{printf("Server IP Address Error!n");exit(1);}server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);socklen_t server_addr_length = sizeof(server_addr);char file_name[FILE_NAME_MAX_SIZE+1];bzero(file_name, FILE_NAME_MAX_SIZE+1);printf("Please Input File Name On Server:t");scanf("%s", file_name);char buffer[BUFFER_SIZE];bzero(buffer,BUFFER_SIZE);strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));//向服务器发送buffer中的数据socklen_t n = sizeof(server_addr) ;sendto(client_socket,buffer,BUFFER_SIZE,0,(struct sockaddr*)&server_addr,n);// int fp = open(file_name, O_WRONLY|O_CREAT);// if( fp < 0 )FILE * fp = fopen(file_name,"w");if(NULL == fp ){printf("File:t%s Can Not Open To Writen", file_name);exit(1);}//从服务器接收数据到buffer中bzero(buffer,BUFFER_SIZE);int length = 0;while( length = recv(client_socket,buffer,BUFFER_SIZE,0)){if(length < 0){printf("Recieve Data From Server %s Failed!n", argv[1]);break;}// int write_length = write(fp, buffer,length);int write_length = fwrite(buffer,sizeof(char),length,fp);if (write_length服务器端程序的编译 gcc -o file_serverfile_server客户端程序的编译gcc -o file_clientfile_client.c服务器程序和客户端程应当分别运行在2台计算机上.服务器端程序的运行,在一个计算机的终端执行./file_server客户端程序的运行,在另一个计算机的终端中执行./file_client运行服务器程序的计算机的IP地址根据提示输入要传输的服务器上的文件,该文件在服务器的运行目录上在实际编程和测试中,可以用2个终端代替2个计算机,这样就可以在一台计算机上测试网络程序,服务器端程序的运行,在一个终端执行./file_server客户端程序的运行,在另一个终端中执行./file_client127.0.0.1说明: 任何计算机都可以通过127.0.0.1访问自己. 也可以用计算机的实际IP地址代替127.0.0.1//////////////////////////////////////////////////////////////////////////////////////// file_server.c文件传输顺序服务器示例////////////////////////////////////////////////////////////////////////////////////////本文件是服务器的代码#include // for sockaddr_in#include // for socket#include // for socket#include // for printf#include // for exit#include // for bzero/*#include #include #include #include */#define HELLO_WORLD_SERVER_PORT6666#define LENGTH_OF_LISTEN_QUEUE20#define BUFFER_SIZE 1024#define FILE_NAME_MAX_SIZE 512int main(int argc, char **argv){//设置一个socket地址结构server_addr,代表服务器internet地址, 端口struct sockaddr_in server_addr;bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htons(INADDR_ANY);server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);//创建用于internet的流协议(TCP)socket,用server_socket代表服务器socketint server_socket = socket(PF_INET,SOCK_STREAM,0);if( server_socket < 0){printf("Create Socket Failed!");exit(1);}//把socket和socket地址结构联系起来if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr))){printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);exit(1);}//server_socket用于监听if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) ){printf("Server Listen Failed!");exit(1);}while (1) //服务器端要一直运行{//定义客户端的socket地址结构client_addrstruct sockaddr_in client_addr;socklen_t length = sizeof(client_addr);//接受一个到server_socket代表的socket的一个连接//如果没有连接请求,就等待到有连接请求--这是accept函数的特性//accept函数返回一个新的socket,这个socket(new_server_socket)用于同连接到的客户的通信//new_server_socket代表了服务器和客户端之间的一个通信通道//accept函数把连接到的客户端信息填写到客户端的socket地址结构client_addr中int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);if ( new_server_socket < 0){printf("Server Accept Failed!n");break;}char buffer[BUFFER_SIZE];bzero(buffer, BUFFER_SIZE);length = recv(new_server_socket,buffer,BUFFER_SIZE,0);if (length < 0){printf("Server Recieve Data Failed!n");break;}char file_name[FILE_NAME_MAX_SIZE+1];bzero(file_name, FILE_NAME_MAX_SIZE+1);strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));//int fp = open(file_name, O_RDONLY);//if( fp < 0 )FILE * fp = fopen(file_name,"r");if(NULL == fp ){printf("File:t%s Not Foundn", file_name);}else{bzero(buffer, BUFFER_SIZE);int file_block_length = 0;//while( (file_block_length = read(fp,buffer,BUFFER_SIZE))>0)while( (file_block_length = fread(buffer,sizeof(char),BUFFER_SIZE,fp))>0){printf("file_block_length = %dn",file_block_length);//发送buffer中的字符串到new_server_socket,实际是给客户端if(send(new_server_socket,buffer,file_block_length,0)<0){printf("Send File:t%s Failedn", file_name);break;}bzero(buffer, BUFFER_SIZE);}//close(fp);fclose(fp);printf("File:t%s Transfer Finishedn",file_name);}//关闭与客户端的连接close(new_server_socket);}//关闭监听用的socketclose(server_socket);return 0;}//////////////////////////////////////////////////////////////////////////////////////// file_client.c文件传输客户端程序示例////////////////////////////////////////////////////////////////////////////////////////本文件是客户机的代码#include // for sockaddr_in#include // for socket#include // for socket#include // for printf#include // for exit#include // for bzero/*#include #include #include #include */#define HELLO_WORLD_SERVER_PORT6666#define BUFFER_SIZE 1024#define FILE_NAME_MAX_SIZE 512int main(int argc, char **argv){if (argc != 2){printf("Usage: ./%s ServerIPAddressn",argv[0]);exit(1);}//设置一个socket地址结构client_addr,代表客户机internet地址, 端口struct sockaddr_in client_addr;bzero(&client_addr,sizeof(client_addr)); //把一段内存区的内容全部设置为0client_addr.sin_family = AF_INET;//internet协议族client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自动获取本机地址client_addr.sin_port = htons(0);//0表示让系统自动分配一个空闲端口//创建用于internet的流协议(TCP)socket,用client_socket代表客户机socketint client_socket = socket(AF_INET,SOCK_STREAM,0);if( client_socket < 0){printf("Create Socket Failed!n");exit(1);}//把客户机的socket和客户机的socket地址结构联系起来if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr))){printf("Client Bind Port Failed!n");exit(1);}//设置一个socket地址结构server_addr,代表服务器的internet地址, 端口struct sockaddr_in server_addr;bzero(&server_addr,sizeof(server_addr));server_addr.sin_family = AF_INET;if(inet_aton(argv[1],&server_addr.sin_addr) == 0) //服务器的IP地址来自程序的参数{printf("Server IP Address Error!n");exit(1);}server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);socklen_t server_addr_length = sizeof(server_addr);//向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) < 0){printf("Can Not Connect To %s!n",argv[1]);exit(1);}char file_name[FILE_NAME_MAX_SIZE+1];bzero(file_name, FILE_NAME_MAX_SIZE+1);printf("Please Input File Name On Server:t");scanf("%s", file_name);char buffer[BUFFER_SIZE];bzero(buffer,BUFFER_SIZE);strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));//向服务器发送buffer中的数据send(client_socket,buffer,BUFFER_SIZE,0);//int fp = open(file_name, O_WRONLY|O_CREAT);//if( fp < 0 )FILE * fp = fopen(file_name,"w");if(NULL == fp ){printf("File:t%s Can Not Open To Writen", file_name);exit(1);}//从服务器接收数据到buffer中bzero(buffer,BUFFER_SIZE);int length = 0;while( length = recv(client_socket,buffer,BUFFER_SIZE,0)){if(length < 0){printf("Recieve Data From Server %s Failed!n", argv[1]);break;}//int write_length = write(fp, buffer,length);int write_length = fwrite(buffer,sizeof(char),length,fp);if (write_length你传输文本的时候用的什么函数阿?send/recv?还是sendto/recvfrom?或者直接read/write? 文件不是一样的?只不过需要自己拟定一个协议,比如先发送文件大小,然后把文件打开了往里放不就好了,没有难度吧

利用java socket实现文件传输
1.服务器端 package sterning;import java.io.BufferedInputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.net.ServerSocket;import java.net.Socket;public class ServerTest {int port = 8821;void start() {Socket s = null;try {ServerSocket ss = new ServerSocket(port);while (true) {// 选择进行传输的文件String filePath = "D:\lib.rar";File fi = new File(filePath);System.out.println("文件长度:" + (int) fi.length());// public Socket accept() throws// IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。s = ss.accept();System.out.println("建立socket链接");DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));dis.readByte();DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));DataOutputStream ps = new DataOutputStream(s.getOutputStream());//将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见Think In Java 4th里有现成的代码。ps.writeUTF(fi.getName());ps.flush();ps.writeLong((long) fi.length());ps.flush();int bufferSize = 8192;byte[] buf = new byte[bufferSize];while (true) {int read = 0;if (fis != null) {read = fis.read(buf);}if (read == -1) {break;}ps.write(buf, 0, read);}ps.flush();// 注意关闭socket链接哦,不然客户端会等待server的数据过来,// 直到socket超时,导致数据不完整。fis.close();s.close();System.out.println("文件传输完成");}} catch (Exception e) {e.printStackTrace();}}public static void main(String arg[]) {new ServerTest().start();}}2.socket的Util辅助类package sterning;import java.net.*;import java.io.*;public class ClientSocket {private String ip;private int port;private Socket socket = null;DataOutputStream out = null;DataInputStream getMessageStream = null;public ClientSocket(String ip, int port) {this.ip = ip;this.port = port;}/** *//*** 创建socket连接** @throws Exception* exception*/public void CreateConnection() throws Exception {try {socket = new Socket(ip, port);} catch (Exception e) {e.printStackTrace();if (socket != null)socket.close();throw e;} finally {}}public void sendMessage(String sendMessage) throws Exception {try {out = new DataOutputStream(socket.getOutputStream());if (sendMessage.equals("Windows")) {out.writeByte(0x1);out.flush();return;}if (sendMessage.equals("Unix")) {out.writeByte(0x2);out.flush();return;}if (sendMessage.equals("Linux")) {out.writeByte(0x3);out.flush();} else {out.writeUTF(sendMessage);out.flush();}} catch (Exception e) {e.printStackTrace();if (out != null)out.close();throw e;} finally {}}public DataInputStream getMessageStream() throws Exception {try {getMessageStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));return getMessageStream;} catch (Exception e) {e.printStackTrace();if (getMessageStream != null)getMessageStream.close();throw e;} finally {}}public void shutDownConnection() {try {if (out != null)out.close();if (getMessageStream != null)getMessageStream.close();if (socket != null)socket.close();} catch (Exception e) {}}}3.客户端package sterning;import java.io.BufferedOutputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.FileOutputStream;public class ClientTest {private ClientSocket cs = null;private String ip = "localhost";// 设置成服务器IPprivate int port = 8821;private String sendMessage = "Windwos";public ClientTest() {try {if (createConnection()) {sendMessage();getMessage();}} catch (Exception ex) {ex.printStackTrace();}}private boolean createConnection() {cs = new ClientSocket(ip, port);try {cs.CreateConnection();System.out.print("连接服务器成功!" + "n");return true;} catch (Exception e) {System.out.print("连接服务器失败!" + "n");return false;}}private void sendMessage() {if (cs == null)return;try {cs.sendMessage(sendMessage);} catch (Exception e) {System.out.print("发送消息失败!" + "n");}}private void getMessage() {if (cs == null)return;DataInputStream inputStream = null;try {inputStream = cs.getMessageStream();} catch (Exception e) {System.out.print("接收消息缓存错误n");return;}try {//本地保存路径,文件名会自动从服务器端继承而来。String savePath = "E:\";int bufferSize = 8192;byte[] buf = new byte[bufferSize];int passedlen = 0;long len=0;savePath += inputStream.readUTF();DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath))));len = inputStream.readLong();System.out.println("文件的长度为:" + len + "n");System.out.println("开始接收文件!" + "n");while (true) {int read = 0;if (inputStream != null) {read = inputStream.read(buf);}passedlen += read;if (read == -1) {break;}//下面进度条本为图形界面的prograssBar做的,这里如果是打文件,可能会重复打印出一些相同的百分比System.out.println("文件接收了" +(passedlen * 100/ len) + "%n");fileOut.write(buf, 0, read);}System.out.println("接收完成,文件存为" + savePath + "n");fileOut.close();} catch (Exception e) {System.out.println("接收消息错误" + "n");return;}}public static void main(String arg[]) {new ClientTest();} }
java中的网络信息传输方式基于TCP协议和UD协议P的,socket是基于TCP协议的实现代码如下: import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.net.InetSocketAddress;import java.net.Socket;public class ClientTcpSend {public static void main(String[] args) {int length = 0;byte[] sendBytes = null;Socket socket = null;DataOutputStream dos = null;FileInputStream fis = null;try {try {socket = new Socket();socket.connect(new InetSocketAddress("127.0.0.1", 33456),dos = new DataOutputStream(socket.getOutputStream());File file = new File("/root/6674541037_c3a9c8b64c_b.jpg");Ffis = new FileInputStream(file);sendBytes = new byte[1024];while ((length = fis.read(sendBytes, 0, sendBytes.length)) > 0) {dos.write(sendBytes, 0, length);dos.flush();}} finally {if (dos != null)dos.close();if (fis != null)fis.close();if (socket != null)socket.close();}} catch (Exception e) {e.printStackTrace();}} }
代码如下: /*import java.io.*;import java.net.*;import java.util.*;*/private HttpURLConnection connection;//存储连接private int downsize = -1;//下载文件大小,初始值为-1private int downed = 0;//文加已下载大小,初始值为0private RandomAccessFile savefile;//记录下载信息存储文件private URL fileurl;//记录要下载文件的地址private DataInputStream fileStream;//记录下载的数据流try{/*开始创建下载的存储文件,并初始化值*/File tempfileobject = new File("h:\webwork-2.1.7.zip");if(!tempfileobject.exists()){/*文件不存在则建立*/tempfileobject.createNewFile();}savefile = new RandomAccessFile(tempfileobject,"rw");/*建立连接*/fileurl = new URL("https://webwork.dev.java.net/files/documents/693/9723/webwork-2.1.7.zip");connection = (HttpURLConnection)fileurl.openConnection();connection.setRequestProperty("Range","byte="+this.downed+"-");this.downsize = connection.getContentLength();//System.out.println(connection.getContentLength());new Thread(this).start();}catch(Exception e){System.out.println(e.toString());System.out.println("构建器错误");System.exit(0);}public void run(){/*开始下载文件,以下测试非断点续传,下载的文件存在问题*/try{System.out.println("begin!");Date begintime = new Date();begintime.setTime(new Date().getTime());byte[] filebyte;int onecelen;//System.out.println(this.connection.getInputStream().getClass().getName());this.fileStream = new DataInputStream(new BufferedInputStream(this.connection.getInputStream()));System.out.println("size = " + this.downsize);while(this.downsize != this.downed){if(this.downsize - this.downed > 262144){//设置为最大256KB的缓存filebyte = new byte[262144];onecelen = 262144;}else{filebyte = new byte[this.downsize - this.downed];onecelen = this.downsize - this.downed;}onecelen = this.fileStream.read(filebyte,0,onecelen);this.savefile.write(filebyte,0,onecelen);this.downed += onecelen;System.out.println(this.downed);}this.savefile.close();System.out.println("end!");System.out.println(begintime.getTime());System.out.println(new Date().getTime());System.out.println(begintime.getTime() - new Date().getTime());}catch(Exception e){System.out.println(e.toString());System.out.println("run()方法有问题!");}}/***//FileClient.javaimport java.io.*;import java.net.*;public class FileClient {public static void main(String[] args) throws Exception {//使用本地文件系统接受网络数据并存为新文件File file = new File("d:\fmd.doc");file.createNewFile();RandomAccessFile raf = new RandomAccessFile(file, "rw");// 通过Socket连接文件服务器Socket server = new Socket(InetAddress.getLocalHost(), 3318);//创建网络接受流接受服务器文件数据InputStream netIn = server.getInputStream();InputStream in = new DataInputStream(new BufferedInputStream(netIn));//创建缓冲区缓冲网络数据byte[] buf = new byte[2048];int num = in.read(buf);while (num != (-1)) {//是否读完所有数据raf.write(buf, 0, num);//将数据写往文件raf.skipBytes(num);//顺序写文件字节num = in.read(buf);//继续从网络中读取文件}in.close();raf.close();}}//FileServer.javaimport java.io.*;import java.util.*;import java.net.*;public class FileServer {public static void main(String[] args) throws Exception {//创建文件流用来读取文件中的数据File file = new File("d:\系统特点.doc");FileInputStream fos = new FileInputStream(file);//创建网络服务器接受客户请求ServerSocket ss = new ServerSocket(8801);Socket client = ss.accept();//创建网络输出流并提供数据包装器OutputStream netOut = client.getOutputStream();OutputStream doc = new DataOutputStream(new BufferedOutputStream(netOut));//创建文件读取缓冲区byte[] buf = new byte[2048];int num = fos.read(buf);while (num != (-1)) {//是否读完文件doc.write(buf, 0, num);//把文件数据写出网络缓冲区doc.flush();//刷新缓冲区把数据写往客户端num = fos.read(buf);//继续从文件中读取数据}fos.close();doc.close();}} */
