java中如何实现从客户端发送文件到服务器端?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中如何实现从客户端发送文件到服务器端?相关的知识,希望对你有一定的参考价值。

参考技术A 服务器端源码:\\x0d\\x0aimport java.io.BufferedReader;\\x0d\\x0aimport java.io.File;\\x0d\\x0aimport java.io.FileNotFoundException;\\x0d\\x0aimport java.io.FileOutputStream;\\x0d\\x0aimport java.io.IOException;\\x0d\\x0aimport java.io.InputStream;\\x0d\\x0aimport java.io.InputStreamReader;\\x0d\\x0aimport java.net.ServerSocket;\\x0d\\x0aimport java.net.Socket;\\x0d\\x0a\\x0d\\x0a/**\\x0d\\x0a *\\x0d\\x0a * 文件名:ServerReceive.java\\x0d\\x0a * 实现功能:作为服务器接收客户端发送的文件\\x0d\\x0a *\\x0d\\x0a * 具体实现过程:\\x0d\\x0a * 1、建立SocketServer,等待客户端的连接\\x0d\\x0a * 2、当有客户端连接的时候,按照双方的约定,这时要读取一行数据\\x0d\\x0a * 其中保存客户端要发送的文件名和文件大小信息\\x0d\\x0a * 3、根据文件名在本地创建文件,并建立好流通信\\x0d\\x0a * 4、循环接收数据包,将数据包写入文件\\x0d\\x0a * 5、当接收数据的长度等于提前文件发过来的文件长度,即表示文件接收完毕,关闭文件\\x0d\\x0a * 6、文件接收工作结束\\x0d\\x0a\\x0d\\x0apublic class ServerReceive \\x0d\\x0a \\x0d\\x0a public static void main(String[] args) \\x0d\\x0a \\x0d\\x0a /**与服务器建立连接的通信句柄*/\\x0d\\x0a ServerSocket ss = null;\\x0d\\x0a Socket s = null;\\x0d\\x0a \\x0d\\x0a /**定义用于在接收后在本地创建的文件对象和文件输出流对象*/\\x0d\\x0a File file = null;\\x0d\\x0a FileOutputStream fos = null;\\x0d\\x0a \\x0d\\x0a /**定义输入流,使用socket的inputStream对数据包进行输入*/\\x0d\\x0a InputStream is = null;\\x0d\\x0a \\x0d\\x0a /**定义byte数组来作为数据包的存储数据包*/\\x0d\\x0a byte[] buffer = new byte[4096 * 5];\\x0d\\x0a \\x0d\\x0a /**用来接收文件发送请求的字符串*/\\x0d\\x0a String comm = null;\\x0d\\x0a\\x0d\\x0a/**建立socekt通信,等待服务器进行连接*/\\x0d\\x0a try \\x0d\\x0a ss = new ServerSocket(4004);\\x0d\\x0a s = ss.accept();\\x0d\\x0a catch (IOException e) \\x0d\\x0a e.printStackTrace();\\x0d\\x0a \\x0d\\x0a\\x0d\\x0a/**读取一行客户端发送过来的约定信息*/\\x0d\\x0a try \\x0d\\x0a InputStreamReader isr = new InputStreamReader(s.getInputStream());\\x0d\\x0a BufferedReader br = new BufferedReader(isr);\\x0d\\x0a comm = br.readLine();\\x0d\\x0a catch (IOException e) \\x0d\\x0a System.out.println("服务器与客户端断开连接");\\x0d\\x0a \\x0d\\x0a \\x0d\\x0a /**开始解析客户端发送过来的请求命令*/\\x0d\\x0a int index = comm.indexOf("/#");\\x0d\\x0a \\x0d\\x0a /**判断协议是否为发送文件的协议*/\\x0d\\x0a String xieyi = comm.substring(0, index);\\x0d\\x0a if(!xieyi.equals("111"))\\x0d\\x0a System.out.println("服务器收到的协议码不正确");\\x0d\\x0a return;\\x0d\\x0a \\x0d\\x0a \\x0d\\x0a /**解析出文件的名字和大小*/\\x0d\\x0a comm = comm.substring(index + 2);\\x0d\\x0a index = comm.indexOf("/#");\\x0d\\x0a String filename = comm.substring(0, index).trim();\\x0d\\x0a String filesize = comm.substring(index + 2).trim();\\x0d\\x0a\\x0d\\x0a/**创建空文件,用来进行接收文件*/\\x0d\\x0a file = new File(filename);\\x0d\\x0a if(!file.exists())\\x0d\\x0a try \\x0d\\x0a file.createNewFile();\\x0d\\x0a catch (IOException e) \\x0d\\x0a System.out.println("服务器端创建文件失败");\\x0d\\x0a \\x0d\\x0a else\\x0d\\x0a /**在此也可以询问是否覆盖*/\\x0d\\x0a System.out.println("本路径已存在相同文件,进行覆盖");\\x0d\\x0a \\x0d\\x0a \\x0d\\x0a /**【以上就是客户端代码中写到的服务器的准备部分】*/\\x0d\\x0a\\x0d\\x0a/**\\x0d\\x0a * 服务器接收文件的关键代码*/\\x0d\\x0a try \\x0d\\x0a /**将文件包装到文件输出流对象中*/\\x0d\\x0a fos = new FileOutputStream(file);\\x0d\\x0a long file_size = Long.parseLong(filesize);\\x0d\\x0a is = s.getInputStream();\\x0d\\x0a /**size为每次接收数据包的长度*/\\x0d\\x0a int size = 0;\\x0d\\x0a /**count用来记录已接收到文件的长度*/\\x0d\\x0a long count = 0;\\x0d\\x0a \\x0d\\x0a /**使用while循环接收数据包*/\\x0d\\x0a while(count < file_size)\\x0d\\x0a /**从输入流中读取一个数据包*/\\x0d\\x0a size = is.read(buffer);\\x0d\\x0a \\x0d\\x0a /**将刚刚读取的数据包写到本地文件中去*/\\x0d\\x0a fos.write(buffer, 0, size);\\x0d\\x0a fos.flush();\\x0d\\x0a \\x0d\\x0a /**将已接收到文件的长度+size*/\\x0d\\x0a count += size;\\x0d\\x0a System.out.println("服务器端接收到数据包,大小为" + size);\\x0d\\x0a \\x0d\\x0a \\x0d\\x0a catch (FileNotFoundException e) \\x0d\\x0a System.out.println("服务器写文件失败");\\x0d\\x0a catch (IOException e) \\x0d\\x0a System.out.println("服务器:客户端断开连接");\\x0d\\x0a finally\\x0d\\x0a /**\\x0d\\x0a * 将打开的文件关闭\\x0d\\x0a * 如有需要,也可以在此关闭socket连接\\x0d\\x0a * */\\x0d\\x0a try \\x0d\\x0a if(fos != null)\\x0d\\x0a fos.close();\\x0d\\x0a catch (IOException e) \\x0d\\x0a e.printStackTrace();\\x0d\\x0a //catch (IOException e)\\x0d\\x0a //finally\\x0d\\x0a \\x0d\\x0a //public static void main(String[] args)\\x0d\\x0a//public class ServerReceive\\x0d\\x0a\\x0d\\x0a客户端源码:\\x0d\\x0a\\x0d\\x0aimport java.io.File;\\x0d\\x0aimport java.io.FileInputStream;\\x0d\\x0aimport java.io.FileNotFoundException;\\x0d\\x0aimport java.io.IOException;\\x0d\\x0aimport java.io.OutputStream;\\x0d\\x0aimport java.io.PrintStream;\\x0d\\x0aimport java.net.Socket;\\x0d\\x0a\\x0d\\x0a/**\\x0d\\x0a *\\x0d\\x0a * 文件名:ClientSend.java\\x0d\\x0a * 实现功能:作为客户端向服务器发送一个文件\\x0d\\x0a *\\x0d\\x0a * 具体实现过程:\\x0d\\x0a * 1、建立与服务器端的连接,IP:127.0.0.1, port:4004\\x0d\\x0a * 2、将文件的名字和大小通过自定义的文件传输协议,发送到服务器\\x0d\\x0a * 3、循环读取本地文件,将文件打包发送到数据输出流中\\x0d\\x0a * 4、关闭文件,结束传输\\x0d\\x0a *\\x0d\\x0a * */\\x0d\\x0a \\x0d\\x0apublic class ClientSend \\x0d\\x0a \\x0d\\x0a public static void main(String[] args) \\x0d\\x0a \\x0d\\x0a /**与服务器建立连接的通信句柄*/\\x0d\\x0a Socket s = null;\\x0d\\x0a \\x0d\\x0a /**定义文件对象,即为要发送的文件\\x0d\\x0a * 如果使用绝对路径,不要忘记使用\'/\'和\'\\'的区别\\x0d\\x0a * 具体区别,请读者自行查询\\x0d\\x0a * */\\x0d\\x0a File sendfile = new File("API.CHM");\\x0d\\x0a /**定义文件输入流,用来打开、读取即将要发送的文件*/\\x0d\\x0a FileInputStream fis = null;\\x0d\\x0a /**定义byte数组来作为数据包的存储数据包*/\\x0d\\x0a byte[] buffer = new byte[4096 * 5];\\x0d\\x0a \\x0d\\x0a /**定义输出流,使用socket的outputStream对数据包进行输出*/\\x0d\\x0a OutputStream os = null;\\x0d\\x0a\\x0d\\x0a/**检查要发送的文件是否存在*/\\x0d\\x0a if(!sendfile.exists())\\x0d\\x0a System.out.println("客户端:要发送的文件不存在");\\x0d\\x0a return;\\x0d\\x0a \\x0d\\x0a\\x0d\\x0a/**与服务器建立连接*/\\x0d\\x0a try \\x0d\\x0a s = new Socket("127.0.0.1", 4004);\\x0d\\x0a catch (IOException e) \\x0d\\x0a System.out.println("未连接到服务器");\\x0d\\x0a \\x0d\\x0a \\x0d\\x0a /**用文件对象初始化fis对象\\x0d\\x0a * 以便于可以提取出文件的大小\\x0d\\x0a * */\\x0d\\x0a try \\x0d\\x0a fis = new FileInputStream(sendfile);\\x0d\\x0a catch (FileNotFoundException e1) \\x0d\\x0a e1.printStackTrace();\\x0d\\x0a \\x0d\\x0a\\x0d\\x0a/**首先先向服务器发送关于文件的信息,以便于服务器进行接收的相关准备工作\\x0d\\x0a * 具体的准备工作,请查看服务器代码。\\x0d\\x0a *\\x0d\\x0a * 发送的内容包括:发送文件协议码(此处为111)/#文件名(带后缀名)/#文件大小\\x0d\\x0a * */\\x0d\\x0a try \\x0d\\x0a PrintStream ps = new PrintStream(s.getOutputStream());\\x0d\\x0a ps.println("111/#" + sendfile.getName() + "/#" + fis.available());\\x0d\\x0a ps.flush();\\x0d\\x0a catch (IOException e) \\x0d\\x0a System.out.println("服务器连接中断");\\x0d\\x0a \\x0d\\x0a\\x0d\\x0a/**\\x0d\\x0a * 此处睡眠2s,等待服务器把相关的工作准备好\\x0d\\x0a * 也是为了保证网络的延迟\\x0d\\x0a * 读者可自行选择添加此代码\\x0d\\x0a * */\\x0d\\x0a try \\x0d\\x0a Thread.sleep(2000);\\x0d\\x0a catch (InterruptedException e1) \\x0d\\x0a e1.printStackTrace();\\x0d\\x0a \\x0d\\x0a\\x0d\\x0a/**之前的准备工作结束之后\\x0d\\x0a * 下面就是文件传输的关键代码\\x0d\\x0a * */\\x0d\\x0a try \\x0d\\x0a \\x0d\\x0a /**获取socket的OutputStream,以便向其中写入数据包*/\\x0d\\x0a os = s.getOutputStream();\\x0d\\x0a \\x0d\\x0a /** size 用来记录每次读取文件的大小*/\\x0d\\x0a int size = 0;\\x0d\\x0a \\x0d\\x0a /**使用while循环读取文件,直到文件读取结束*/\\x0d\\x0a while((size = fis.read(buffer)) != -1)\\x0d\\x0a System.out.println("客户端发送数据包,大小为" + size);\\x0d\\x0a /**向输出流中写入刚刚读到的数据包*/\\x0d\\x0a os.write(buffer, 0, size);\\x0d\\x0a /**刷新一下*/\\x0d\\x0a os.flush();\\x0d\\x0a \\x0d\\x0a catch (FileNotFoundException e) \\x0d\\x0a System.out.println("客户端读取文件出错");\\x0d\\x0a catch (IOException e) \\x0d\\x0a System.out.println("客户端输出文件出错");\\x0d\\x0a finally\\x0d\\x0a \\x0d\\x0a /**\\x0d\\x0a * 将打开的文件关闭\\x0d\\x0a * 如有需要,也可以在此关闭socket连接\\x0d\\x0a * */\\x0d\\x0a try \\x0d\\x0a if(fis != null)\\x0d\\x0a fis.close();\\x0d\\x0a catch (IOException e) \\x0d\\x0a System.out.println("客户端文件关闭出错");\\x0d\\x0a //catch (IOException e)\\x0d\\x0a //finally\\x0d\\x0a \\x0d\\x0a //public static void main(String[] args)\\x0d\\x0a//public class ClientSend

C# 如何实现服务端发送对象到客户端

给个代码最好 比如我写好了一个学生类 要把这个类发送到另外一台电脑上(就是客户端)怎么实现。。。求助啊
C/S程序 听说用序列化可以 但是看了一下 好像也只能在一台电脑上传递对象, (是传递对象 不是文件) 我要用此对象 不是要数据 如果可以 最好是用SOCKET传递 我是新手 希望那位高手给个详细点的代码 谢谢 (注意:是在两台电脑上传递对象 一台电脑上的对象 传递给另外一台电脑使用)

显然不是socket,既然选用C#当然Remoting才是王道,
首先需要一个interface(或者叫抽象类?)作为服务端和客户端的通讯协议。
然后server完全实现这个接口类,客户端就可以直接调用对应的方法。
服务端缓存所有客户对象,然后就可以根据需要传输任何对象(实例化的类,你传类没用~)
我们原来的毕业课题是多人联网对战游戏。

using System.Configuration;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
这几个应该会用到
客户端需要这个连接服务器,最好再做一个配置文件,便于以后服务器地址的修改。
RemotingServices.Connect()
参考技术A 老实说这跟应用有关,
1、请问服务器、客户端所要使用的对象的类库都被引用
2、客户端没有添加该类库
3、通过什么方式传送,如http、邮件、socket、局域网、U盘等
4、是使用对象的数据还是同时调用方法呢?
Http方式推荐使用wenservice
其他方式推荐使用序列化!
如果客户端是另一套程序根本就没有对该对象的引用,又需要调用方法可能还有传方法名过去,可以序列化对象和序列化代码,客户端动态编译代码调用!
不过推荐使用WCF!
参考技术B 楼上说的对,一个方法就是用webservice,在你的机子上写好一个webservice方法,抛出接口,然后再另一台机器上添加这个webservice接口的引用。

第二个方法就是直接把你写的类编译成dll,直接进行调用就可以了,这个方法简单,但不支持实时更新,也就是说你改了类之后要重新编译成dll,那边才能用。
参考技术C 你这个是C/S的还是B/S的呢?B/S的用RESPONSE这个对象,你没说清楚是发送一个对象还是一个文件。 参考技术D 可以使用rumoting,定义个MarshalByRefObject类,看一下MSDN就会了

以上是关于java中如何实现从客户端发送文件到服务器端?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用处理程序的情况下使用 ajax 从客户端将文件发送到服务器端?

在 React(客户端)中上传 .json 文件并将其发送到 Node(服务器端)

java如何实现两个客服端之间互相发送信息

如何在同一GET请求中呈现文件并将数据发送到页面

C# 如何实现服务端发送对象到客户端

基于UDP用JAVA实现客户端和服务端通信