展开全部

服务器端源码:

import java.io.BufferedReader;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.ServerSocket;

import java.net.Socket;

/**

*

* 文件e68a84e8a2ad62616964757a686964616f31333361306365名:ServerReceive.java

* 实现功能:作为服务器接收客户端发送的文件

*

* 具体实现过程:

* 1、建立SocketServer,等待客户端的连接

* 2、当有客户端连接的时候,按照双方的约定,这时要读取一行数据

* 其中保存客户端要发送的文件名和文件大小信息

* 3、根据文件名在本地创建文件,并建立好流通信

* 4、循环接收数据包,将数据包写入文件

* 5、当接收数据的长度等于提前文件发过来的文件长度,即表示文件接收完毕,关闭文件

* 6、文件接收工作结束

public class ServerReceive {

public static void main(String[] args) {

/**与服务器建立连接的通信句柄*/

ServerSocket ss = null;

Socket s = null;

/**定义用于在接收后在本地创建的文件对象和文件输出流对象*/

File file = null;

FileOutputStream fos = null;

/**定义输入流,使用socket的inputStream对数据包进行输入*/

InputStream is = null;

/**定义byte数组来作为数据包的存储数据包*/

byte[] buffer = new byte[4096 * 5];

/**用来接收文件发送请求的字符串*/

String comm = null;

/**建立socekt通信,等待服务器进行连接*/

try {

ss = new ServerSocket(4004);

s = ss.accept();

} catch (IOException e) {

e.printStackTrace();

}

/**读取一行客户端发送过来的约定信息*/

try {

InputStreamReader isr = new InputStreamReader(s.getInputStream());

BufferedReader br = new BufferedReader(isr);

comm = br.readLine();

} catch (IOException e) {

System.out.println("服务器与客户端断开连接");

}

/**开始解析客户端发送过来的请求命令*/

int index = comm.indexOf("/#");

/**判断协议是否为发送文件的协议*/

String xieyi = comm.substring(0, index);

if(!xieyi.equals("111")){

System.out.println("服务器收到的协议码不正确");

return;

}

/**解析出文件的名字和大小*/

comm = comm.substring(index + 2);

index = comm.indexOf("/#");

String filename = comm.substring(0, index).trim();

String filesize = comm.substring(index + 2).trim();

/**创建空文件,用来进行接收文件*/

file = new File(filename);

if(!file.exists()){

try {

file.createNewFile();

} catch (IOException e) {

System.out.println("服务器端创建文件失败");

}

}else{

/**在此也可以询问是否覆盖*/

System.out.println("本路径已存在相同文件,进行覆盖");

}

/**【以上就是客户端代码中写到的服务器的准备部分】*/

/**

* 服务器接收文件的关键代码*/

try {

/**将文件包装到文件输出流对象中*/

fos = new FileOutputStream(file);

long file_size = Long.parseLong(filesize);

is = s.getInputStream();

/**size为每次接收数据包的长度*/

int size = 0;

/**count用来记录已接收到文件的长度*/

long count = 0;

/**使用while循环接收数据包*/

while(count < file_size){

/**从输入流中读取一个数据包*/

size = is.read(buffer);

/**将刚刚读取的数据包写到本地文件中去*/

fos.write(buffer, 0, size);

fos.flush();

/**将已接收到文件的长度+size*/

count += size;

System.out.println("服务器端接收到数据包,大小为" + size);

}

} catch (FileNotFoundException e) {

System.out.println("服务器写文件失败");

} catch (IOException e) {

System.out.println("服务器:客户端断开连接");

}finally{

/**

* 将打开的文件关闭

* 如有需要,也可以在此关闭socket连接

* */

try {

if(fos != null)

fos.close();

} catch (IOException e) {

e.printStackTrace();

}//catch (IOException e)

}//finally

}//public static void main(String[] args)

}//public class ServerReceive

客户端源码:

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.OutputStream;

import java.io.PrintStream;

import java.net.Socket;

/**

*

* 文件名:ClientSend.java

* 实现功能:作为客户端向服务器发送一个文件

*

* 具体实现过程:

* 1、建立与服务器端的连接,IP:127.0.0.1, port:4004

* 2、将文件的名字和大小通过自定义的文件传输协议,发送到服务器

* 3、循环读取本地文件,将文件打包发送到数据输出流中

* 4、关闭文件,结束传输

*

* */

public class ClientSend {

public static void main(String[] args) {

/**与服务器建立连接的通信句柄*/

Socket s = null;

/**定义文件对象,即为要发送的文件

* 如果使用绝对路径,不要忘记使用'/'和'\'的区别

* 具体区别,请读者自行查询

* */

File sendfile = new File("API.CHM");

/**定义文件输入流,用来打开、读取即将要发送的文件*/

FileInputStream fis = null;

/**定义byte数组来作为数据包的存储数据包*/

byte[] buffer = new byte[4096 * 5];

/**定义输出流,使用socket的outputStream对数据包进行输出*/

OutputStream os = null;

/**检查要发送的文件是否存在*/

if(!sendfile.exists()){

System.out.println("客户端:要发送的文件不存在");

return;

}

/**与服务器建立连接*/

try {

s = new Socket("127.0.0.1", 4004);

}catch (IOException e) {

System.out.println("未连接到服务器");

}

/**用文件对象初始化fis对象

* 以便于可以提取出文件的大小

* */

try {

fis = new FileInputStream(sendfile);

} catch (FileNotFoundException e1) {

e1.printStackTrace();

}

/**首先先向服务器发送关于文件的信息,以便于服务器进行接收的相关准备工作

* 具体的准备工作,请查看服务器代码。

*

* 发送的内容包括:发送文件协议码(此处为111)/#文件名(带后缀名)/#文件大小

* */

try {

PrintStream ps = new PrintStream(s.getOutputStream());

ps.println("111/#" + sendfile.getName() + "/#" + fis.available());

ps.flush();

} catch (IOException e) {

System.out.println("服务器连接中断");

}

/**

* 此处睡眠2s,等待服务器把相关的工作准备好

* 也是为了保证网络的延迟

* 读者可自行选择添加此代码

* */

try {

Thread.sleep(2000);

} catch (InterruptedException e1) {

e1.printStackTrace();

}

/**之前的准备工作结束之后

* 下面就是文件传输的关键代码

* */

try {

/**获取socket的OutputStream,以便向其中写入数据包*/

os = s.getOutputStream();

/** size 用来记录每次读取文件的大小*/

int size = 0;

/**使用while循环读取文件,直到文件读取结束*/

while((size = fis.read(buffer)) != -1){

System.out.println("客户端发送数据包,大小为" + size);

/**向输出流中写入刚刚读到的数据包*/

os.write(buffer, 0, size);

/**刷新一下*/

os.flush();

}

} catch (FileNotFoundException e) {

System.out.println("客户端读取文件出错");

} catch (IOException e) {

System.out.println("客户端输出文件出错");

}finally{

/**

* 将打开的文件关闭

* 如有需要,也可以在此关闭socket连接

* */

try {

if(fis != null)

fis.close();

} catch (IOException e) {

System.out.println("客户端文件关闭出错");

}//catch (IOException e)

}//finally

}//public static void main(String[] args)

}//public class ClientSend

本回答被网友采纳

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

java做服务器端给客户端传数据包_java 服务器怎样给客户端传输数据相关推荐

  1. java怎么把数据返回给客户端_java 服务器怎样给客户端传输数据

    服务器端源码: import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; im ...

  2. 怎么把手机文件导入华为云服务器,华为手机如何上传数据到云服务器

    华为手机如何上传数据到云服务器 内容精选 换一换 对象存储服务OBS是华为云提供的稳定.安全.高效.易用的云存储服务,具备标准Restful API接口,可存储任意数量和形式的非结构化数据.弹性文件服 ...

  3. 单片机传输信息到服务器,单片机传数据到云服务器

    单片机传数据到云服务器 内容精选 换一换 假设您的云服务器已经部署好应用,您可以将这台云服务器创建为私有镜像,然后通过私有镜像创建相同配置的云服务器,省去重复部署应用的时间.参考如下指导:通过云服务器 ...

  4. 使用FTP上传数据到云服务器 CuteFTP和LeapFTP软件使用教程

    从本地向服务器上传大文件时通常需要采用FTP数据传输方式,本文整理了目前常用的CuteFTP和LeapFTP两款FTP第三方服务器软件,教大家如何将本地文件上传至服务器. CuteFTP软件下载 Le ...

  5. Java实现客户端向服务器端定时上传数据

    在客户端用户操作后,先将数据上传到服务器再响应给用户,响应过程可能会比较慢.为了快速响应用户操作,可以先将数据存到客户端中,后面再将数据按一定时间段上传到服务器上.本文将介绍:"定义一个用于 ...

  6. java 解析数据包_java - 如何在Java中正确解析TCP数据包? - 堆栈内存溢出

    我目前有一个简单的TCP服务器,该服务器调用一个函数,并在每个新的传入数据包上以字节数组的形式将二进制TCP有效负载传递给它,解析它的正确方法是什么? 我试图通过将其切成不同的字节数组并分别进行处理来 ...

  7. java tcp数据包_java tcp封装成数据包【相关词_ tcp数据包处理java】

    2-1.数据序号32位,TCP为发送的每一个字节都编一个号码,这里存储当前数据包数据第一 包括 网络编程结构数据JavaTCPIP的信息,所有JAVA网络编程:TCP/IP数据包结构相关内 Java实 ...

  8. JAVA网络编程:TCP/IP数据包结构

    2019独角兽企业重金招聘Python工程师标准>>> 一般来说,网络编程我们仅仅须要调用一些封装好的函数或者组件就能完毕大部分的工作,可是一些特殊的情况下,就须要深入的理解网络数据 ...

  9. java写出http数据包_java用jpcap怎么识别出http和https的数据包?

    问题简述: 利用java的第三方库jpcap写抓包程序,求解怎么识别出http和https的数据包(就只要能判断出是http协议或https协议即可). 测试的解法: 1.在tcp包(jpcap自带T ...

最新文章

  1. c语言二分法查找次数,二分法查找
  2. c语言结构体易错点,C语言结构体注意点
  3. 【Linux】 诊断工具-strace
  4. JavaScript--模拟网络爬虫
  5. 持续集成部署Jenkins工作笔记0004---Subversion环境要求
  6. 浅议.NET、ASP.NET和C#的关系
  7. 解决 jQuery 和其他库的冲突
  8. Android Material文本字段
  9. xshell连接及优化
  10. 印象笔记剪藏html,印象笔记使用剪藏功能的详细操作
  11. c语言负数左移右移_C语言负数的移位运算
  12. GO语言-panic和recover
  13. python情绪识别_使用百度对话情绪识别api分析文本
  14. 重装Win10系统其他盘的东西还在吗?
  15. 今日的金山,而非往日的金山
  16. Hugo创建个人学术主页
  17. 列表标签,表格标签,表单标签
  18. Android Framework学习目录
  19. 思科静态路由和浮动路由的配置
  20. 80后、90后、00后互联网人如何找工作

热门文章

  1. JUnit 5符合AssertJ
  2. hibernate 继承_Hibernate继承:每个类层次结构的表
  3. Java EE 8 MVC:全局异常处理
  4. Spring Integration Framework简介
  5. 实用常识_实用垃圾收集,第1部分–简介
  6. Java 8 Friday Goodies:轻松派本地缓存
  7. 将旧项目从Ant迁移到Maven的4个简单步骤
  8. Java方法中的参数太多,第7部分:可变状态
  9. php 获取请求设备,php – 如何获取设备令牌
  10. java控制图片移动_多线程控制图片移动