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

展开全部

服务器端源码:

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

本回答被网友采纳

2Q==

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pooled-jms_Hibernate隐藏的宝石:pooled-lo优化器

pooled-jms介绍 在这篇文章中&#xff0c;我们将揭示一个序列标识符生成器&#xff0c;​​它结合了标识符分配效率和与其他外部系统的互操作性&#xff08;同时访问底层数据库系统&#xff09;。 传统上&#xff0c;有两种序列标识符策略可供选择。 序列标识符&#xff0c;对…

apache geode项目结构_Apache Flink-基于Java项目模板创建Flink应用(流计算和批计算)...

Apache Flink创建模板项目有2种方式&#xff1a;1. 通过Maven archetype命令创建&#xff1b;2. 通过Flink 提供的Quickstart shell脚本创建&#xff1b;关于Apache Flink的环境搭建&#xff0c;请参考相关链接&#xff1a;Apache Flink快速入门-基本架构、核心概念和运行流程A…

matlabif语句怎么用_公益心 码客行(2)—— 简单语句

回顾与反思&#xff1a;cout语句的用法关于第一课的思考与实践问题&#xff0c;有答案了吗——请写出这个程序的输出结果。#include using namespace std;int main(){cout<<1<cout<<12<return 0;}提示&#xff1a;输出结果如下。13即&#xff1a;输出项为数值…

java 多线程 聊天_Java做一个多线程类似于QQ的聊天程序。

展开全部//时间关系,粗略的做了一下,一个模拟UDP协议的测试,图标,IP,以及端口都可以设成//发送者端的电脑参数32313133353236313431303231363533e78988e69d8331333366306533!import java.awt.BorderLayout;import java.awt.Color;import java.awt.GridLayout;import java.awt.e…

组织机构代码输入测试用例_测试代码以用于过大的输入

组织机构代码输入测试用例在编写单元测试时&#xff0c;我们主要关注业务的正确性。 我们将竭尽所能&#xff0c;开开心心地走在最前沿。 我们有时会进行微基准测试并衡量吞吐量。 但是经常遗漏的一个方面是当输入过大时我们的代码如何表现&#xff1f; 我们测试了如何处理正常…

巴特沃斯滤波器python_如何用Scipy.signal.bu实现带通巴特沃斯滤波器

您可以跳过button的使用&#xff0c;而只需为过滤器选择一个顺序&#xff0c;看看它是否符合您的过滤条件。要生成带通滤波器的滤波器系数&#xff0c;请将滤波器阶数、截止频率Wn[low, high]&#xff08;表示为奈奎斯特频率的分数&#xff0c;即采样频率的一半&#xff09;和频…

java gnu_GNU/Linux下Java开发环境的安装和配置 | 学步园

首先下载JDK&#xff0c;在http://www.oracle.com/technetwork/java/javase/downloads/index.html下载最新版本的JDK&#xff0c;选择平台为linux&#xff0c;就会得到一个二进制文件&#xff0c;我得到的是jdk-6u23-linux-i586.bin&#xff0c;复制到需要安装的地方运行就会自…

css初始化_利用CSS变量实现炫酷的悬浮效果

这个动画是将鼠标移动到订阅按钮上移动光标会显示相应的彩色渐变。这个想法很简单&#xff0c;但是它能使这个按钮脱颖而出&#xff0c;人们一下子就注意到它了&#xff0c;增加了点击的概率。怎样才能达到这个效果&#xff0c;使我们的网站脱颖而出呢&#xff1f;其实&#xf…

glass fish_Glass Fish 4.0.1中的Jersey SSE功能

glass fishGlass Fish为各种Java EE规范捆绑了不同的参考实现&#xff0c;例如&#xff0c;CDI的Weld&#xff0c;JSF的Mojarra&#xff0c;WebSocket的Tyrus&#xff0c;JAX-RS的Jersey。 Glass Fish 4.0.1即将发布&#xff0c;并计划涵盖许多组件/模块的更新&#xff0c;这些…

css清除浮动的几种方法_web前端学习路线分享CSS浮动-清除浮动篇

web前端学习路线分享CSS浮动-清除浮动篇&#xff0c;为什么要清除浮动这里所说的清除浮动&#xff0c;并不是不要浮动了&#xff0c;而是清除浮动与浮动之间的影响。那么到底会有什么影响呢&#xff1f;1&#xff0e;高度塌陷举个例子我们看一下。我们在这里设置了div0是外容器…

AWS Lambda将数据保存在DynamoDB中

在本教程中&#xff0c;我们将看到如何使用AWS Lambda将数据保存在Dynamo DB中。 这是必需的步骤&#xff1a; – 在Dynamo数据库中创建一个名为Employee的表 –创建一个AWS Lambda函数&#xff0c;该函数可以使用Dynamo数据库中的Employee POJO保存雇员的名字和姓氏 –创建…

java list 取几个字段组装成map_24道Java各类常见问题整理

(1) JSP学了EL表达式就行了吧&#xff0c;还需要深入么&#xff1f;还有spring现在学5就行了吧&#xff1f;总觉得类与对象这里好难&#xff0c;理解不来(2) 我想问问在校生需要学习JAVA到哪种程度&#xff0c;然后再学学数据结构和算法能达到校招面试的水平(3) 静态变量与实例…

Maven硒测试自动化教程

在进行测试自动化项目时&#xff0c;您需要与之关联的所有Selenium依赖项。 通常&#xff0c;这些依赖项是在项目生命周期中手动下载和升级的&#xff0c;但是随着项目规模的扩大&#xff0c;管理依赖项可能会非常困难。 这就是为什么需要构建自动化工具&#xff08;例如Maven&…

java确认rabbitmq_RabbitMQ 消息确认机制

生产端 Confirm 消息确认机制消息的确认&#xff0c;是指生产者投递消息后&#xff0c;如果 Broker 收到消息&#xff0c;则会给我们生产者一个应答。生产者进行接收应答&#xff0c;用来确定这条消息是否正常的发送到 Broker &#xff0c;这种方式也是消息的可靠性投递的核心保…

hadoop源码分析_Spark2.x精通:Job触发流程源码深度剖析(一)

&#xff0c; 一、概述 之前几篇文章对Spark集群的Master、Worker启动流程进行了源码剖析&#xff0c;后面直接从客户端角度出发&#xff0c;讲解了spark-submit任务提交过程及driver的启动&#xff1b;集群启动、任务提交、SparkContext初始化等前期准备工作完成之后&am…

如何在Java中将String转换为int

在本教程中&#xff0c;我们将看到将Java中的String转换为int&#xff08;或Integer&#xff09;的各种方法。 您可以使用以下任何一种方式&#xff1a; –使用Integer.parseInt&#xff08;string&#xff09; –使用Integer.valueof&#xff08;string&#xff09; –使用…

jboss 程序位置_介绍JBoss BPM Suite安装程序

jboss 程序位置本周&#xff0c;我们想向您介绍JBoss BRMS和JBoss BPM Suite产品随附的一个鲜为人知的安装程序组件。 请注意&#xff0c;当前所有的演示项目都要求您下载JBoss BPM Suite可部署的eap zip产品文件和JBoss EAP 6.1.1 zip产品文件。 展望未来&#xff0c;我们将迁…

java换成中文_如果我们的编程替换成中文会变成怎样?

首先大概的看一下中文编码&#xff1a;你以为会写中文就会编程吗&#xff1f;这就像你以为会写汉字就会写出好文章一样。编程是和机器沟通&#xff0c;因此要用机器的语言而不是人类的语言。最早的程序就是0和1的数字&#xff0c;不是中文也不是英文。以前的程序员&#xff0c;…

高等数学公式大全_高中物理知识思维导图大全,赶紧收藏!

物理作为理综的重中之重&#xff0c;物理的学习一直是广大考生的难点。如何快捷高效的掌握物理知识点是高考复习的重点之一&#xff0c;根据高中物理三年知识点用思维导图的方式&#xff0c;来助大家掌握物理知识点。运动的描述 重力 基本相互作用 相互作用 牛顿运动定律 力的合…

go环境搭建_学习的golang第一步,搭建我们运行的环境,go! go! go

这是Golang教程系列中的第一个教程。本教程介绍了Go&#xff0c;并讨论了选择Go优于其他编程语言的优势。我们还将学习如何在Mac OS&#xff0c;Windows和Linux中安装Go。介绍Go也称为Golang是由Google开发的一种开源&#xff0c;编译和静态类型的编程语言。创造Go的关键人物是…