文章目录

  • 一,前言
  • 二,实现资源下载
  • 三,资源下载的客户端
  • 四,资源下载的服务器端
  • 五,附源码:
    • 5.1,资源下载的客户端
    • 5,2 ,资源下载的服务器端
  • 六,最后

一,前言

有一个作业需求,如下:
实现用户端输入需要下载的编号【存储在数据库里】,通过TCP连接,发出请求,客户端响应,传输目标文件个用户端。用户端,保存传输过来的文件。

二,实现资源下载

功能需求:
1-在服务器的硬盘创建一个目录,目录中存放供客户端下载的资源文件。
2-创建数据库表,表中存放资源文件的编号和资源文件的地址。

我的数据库截图,和服务端目标路径如下图。

三,资源下载的客户端

功能需求:
1-客户端输入要下载的资源编号
2-将编号发送给服务器
3-接收服务器的资源,保存到文件

服务器的ip,本机:

InetAddress ip=InetAddress.getLocalHost();
Socket client=new Socket(ip, port);

向服务器发送资源编号,编号—键盘输入。

String no;//编号
String name;

上述代码解释:
no变量为编号,name变量为下载资源另存为的名称。

输入下载资源的编号和输入下载资源另存为的名称:

System.out.println("输入下载资源的编号:");
no=scanner.next();
System.out.println("输入下载资源另存为的名称:");
name=scanner.next();

no编号发送给服务器


下载服务器发送来的资源:
```java
OutputStream out=client.getOutputStream();
out.write(no.getBytes());
System.out.println("下载服务器发送来的资源");
InputStream in=client.getInputStream();

字节数组---->保存到文件。

保存文件的路径名。

File file=new File("E:/tcpcont/client/"+name+".jpg");

使用io流。保存文件。下载完成

 FileOutputStream fos=new FileOutputStream(file);
byte[]buf=new byte[1024*10];int len;while((len=in.read(buf))!=-1){fos.write(buf,0,len);}fos.close();client.close();System.out.println("下载完成");

四,资源下载的服务器端

功能需求:
1-接收客户端的编号
2-在资源表中查找对应资源的地址
3-将资源发送给客户端

声明自己的端口

int port=10010;

服务器的ip,本机

InetAddress ip=InetAddress.getLocalHost();
ServerSocket server=new ServerSocket(port);

接收客户端

阻塞式的方法,没有客户端接入,就会一直等待。

Socket client=server.accept();

接收一个资源编号。编号:

InputStream in=client.getInputStream();

将流中的数据读入到buf数组

连接数据库,执行sql语句:
查询resource数据库里,uid为目标值。

Connection conn=JDBCUtils.getConnection();
String sql="SELECT * FROM resource WHERE uid=?";
PreparedStatement pStatement=conn.prepareStatement(sql);
pStatement.setString(1,no);
ResultSet rs=pStatement.executeQuery();

获取返回指针。
使用while函数遍历指针。

 while(rs.next()) {

获取到对应值。

int id = rs.getInt("uid");
String url = rs.getString("url");

将读入的数据写入到输出流,通知客户端,传输结束了。

实验总结:理解tcp的三次握手与连接的建立。
客户端:
1,创建客户端的socket,指定客户端的IP对象和端口。
2,创建客户端的对象,进行数据传输。
3,传输或者接受数据。
4,关闭
服务端:
1,创建在指定端口上的服务端对象ServerSocket。
2,获取到在指定端口上监听到对应的客户端socket对象。
3,传输数据/接收数据。
4,关闭流。

五,附源码:

5.1,资源下载的客户端

package work2;import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;public class client {public static void main(String[] args) throws IOException {int port=10010;//服务器的ip,本机InetAddress ip=InetAddress.getLocalHost();Socket client=new Socket(ip, port);//向服务器发送资源编号//编号---键盘输入String no;//编号String name;Scanner scanner=new Scanner(System.in);System.out.println("输入下载资源的编号:");no=scanner.next();System.out.println("输入下载资源另存为的名称:");name=scanner.next();//no编号发送给服务器OutputStream out=client.getOutputStream();out.write(no.getBytes());System.out.println("下载服务器发送来的资源");InputStream in=client.getInputStream();//字节数组---->保存到文件,File file=new File("E:/tcpcont/client/"+name+".jpg");FileOutputStream fos=new FileOutputStream(file);byte[]buf=new byte[1024*10];int len;while((len=in.read(buf))!=-1){fos.write(buf,0,len);}fos.close();client.close();System.out.println("下载完成");}
}

5,2 ,资源下载的服务器端

package work2;import work2067111119.UserDAO;import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;public class server {static dao service = new dao();public static void main(String[] args) throws IOException, SQLException {//声明自己的端口int port=10010;//服务器的ip,本机InetAddress ip=InetAddress.getLocalHost();ServerSocket server=new ServerSocket(port);
//~~~~~~~~~~~~~~~~//接收while(true){System.out.println("接收一个客户端");Socket client=server.accept();//接收一个资源编号String no;//编号//获取输入流InputStream in=client.getInputStream();byte[]buf=new byte[1024];int len=in.read(buf);//将流中的数据读入到buf数组no=new String(buf,0,len);System.out.println("接收到编号:"+no);//ResultSet rs = service.cha(no);Connection conn=JDBCUtils.getConnection();String sql="SELECT * FROM resource WHERE uid=?";PreparedStatement pStatement=conn.prepareStatement(sql);pStatement.setString(1,no);ResultSet rs=pStatement.executeQuery();while(rs.next()) {int id = rs.getInt("uid");String name = rs.getString("name");String url = rs.getString("url");System.out.println(id+'\t'+name+'\t'+url);if(url!=null){File file=new File(url);FileInputStream fis=new FileInputStream(file);OutputStream out=client.getOutputStream();byte[] fbuf=new byte[1024*10];int flen;while((flen=fis.read(fbuf))!=-1){//将读入的数据写入到输出流out.write(fbuf,0,flen);out.flush();}//传输结束fis.close();//关闭输入流//通知客户端,传输结束了client.shutdownInput();client.close();}}//根据编号查找资源文件//String path=mp3Map.get(no);//根据编号获取编号对应的value值,没有关键字,返回null
//            if(path!=null){//                //有这个资源文件,发送
//                //封装文件
//                File file=new File(path);
//                //输入流读文件的数据--->输出流发送给客户端
//                //输入流  源文件---->字节数组
//                //字节数组--->输出流   客户端
//                FileInputStream fis=new FileInputStream(file);
//                OutputStream out=client.getOutputStream();
//                byte[] fbuf=new byte[1024*10];
//                int flen;
//                while((flen=fis.read(fbuf))!=-1){//                    //将读入的数据写入到输出流
//                    out.write(fbuf,0,flen);
//                    out.flush();
//                }
//                //传输结束
//                fis.close();//关闭输入流
//                //通知客户端,传输结束了
//                client.shutdownInput();
//
//                client.close();
//
//
//            }}}
}

六,最后

有一定的心得。了解了tcp的传输原理。


成功完成需求。实现用户端输入需要下载的编号【存储在数据库里】,通过TCP连接,发出请求,客户端响应,传输目标文件个用户端。用户端,保存传输过来的文件。

Java网络编程之实现资源下载详解【王道Java】相关推荐

  1. 菜猪的JAVA 网络编程学习之Socket用法详解(上)

    在客户/服务器通信模式中,客户端需要主动创建与服务器连接的Socket(套接字),服务器端收到了客户端的连接请求,也会创建与客户连接的Socket.Socket可以看做是通信连接两端的收发器,服务器与 ...

  2. Java多线程编程中Future模式的详解

    转载自 https://www.cnblogs.com/winkey4986/p/6203225.html Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker ...

  3. java web几百万分页_举例详解用Java实现web分页功能的方法

    举例详解用Java实现web分页功能的方法 发布于 2020-11-25| 复制链接 摘记: 分页问题是一个非常普遍的问题,开发者几乎都会遇到,这里不讨论具体如何分页,说明一下Web方式下分页的原理. ...

  4. 【网络编程】Linux tcpdump命令详解---编辑中

    目录 即看即用 详细说明 简介 输出信息含义 链路层头 TCP 数据包 UDP 数据包 SMB/CIFS 解码 AFS 请求和回应 KIP AppleTalk协议 IP 数据包破碎 时间戳 反向过滤 ...

  5. 【网络编程】非阻塞connect详解

    一.为什么使用非阻塞connect TCP连接的建立涉及一个在三路握手过程,阻塞的connect一直等到客户收到自己的SYN的ACK才返回,这需要至少一个RTT时间,RTT时间波动很大从几毫秒到几秒. ...

  6. Java网络编程之Socket和ServerSocket详解

    Socket Socket是实现客户端套接字的类,套接字是两台计算机之间进行通信的端点. Socket的实际工作由SocketImpl类的实例执行 .通过更改用于创建套接字实现的套接字工厂,应用程序可 ...

  7. java用redis缓存的步骤_详解在Java程序中运用Redis缓存对象的方法|chu

    这段时间一直有人问如何在Redis中缓存Java中的List 集合数据,其实很简单,常用的方式有两种: 1. 利用序列化,把对象序列化成二进制格式,Redis 提供了 相关API方法存储二进制,取数据 ...

  8. Java并发编程(一)Thread详解

    一.概述 在开始学习Thread之前,我们先来了解一下 线程和进程之间的关系: 线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位. 线程不能够独立执行,必须依存在应用程序中,由应用程 ...

  9. 【Socket网络编程】17. recv() 函数详解

    recv函数 int recv( SOCKET s, char *buf, int len, int flags); 参数说明 第一个参数指定接收端套接字描述符: 第二个参数指明一个缓冲区,该缓冲区用 ...

最新文章

  1. 在WPF中将图片转换成3D图像并可以旋转
  2. php实现 简单密码(代码颜色变化)
  3. 【Spark】Spark TimeSort 排序
  4. 从Oracle向PPAS移行不成功时的处理
  5. asp.net oracle 问号,ASP.NET中文变问号问题解决方案
  6. 看似无聊的python小游戏 我却摸鱼上班玩了一下午!!
  7. 第八届河南省赛D.引水工程(kruthcra+prime)
  8. vb.net 自定义progressbar
  9. 常见的一些反爬虫策略破解方式-Java网络爬虫系统性学习与实战系列(11)
  10. 经验分布函数(Empirical Distribution Functions)
  11. 最凄美的爱情故事,让每对爱人更长久的文章!!
  12. html5连连看源码解析,JS连连看源码完美注释版(推荐)
  13. ipad iphone开发_如何在iPhone或iPad上“不信任”计算机
  14. 小块渲染VS渐进式渲染
  15. 线性代数常用基本知识整理
  16. Unity-编辑器改成中文
  17. android 呼叫 volte 电话方法
  18. 手把手教你搭建明星脸相似度分析系统
  19. android开发 Activity包含Fragment切换背景黑色闪屏解决方案
  20. Fiddler抓包工的使用

热门文章

  1. 微服务中API网关的作用是什么?
  2. 手风琴效果(jQuery)
  3. 51 汇编语言编程--输入密码
  4. 爬虫之BeautifulSoup
  5. display , visibility
  6. 高盐废水如何处理,离子交换树脂在高盐废水中的应用
  7. linux磁盘分区题目,Linux练习例题(附答案)
  8. 【2022年1月1日更新】宝塔+青龙+Nvjdc一对一推送+wskey智能化+管理员推送+Ninja+SaoBing面板+kingfeng+go-cqhttp/qqbot
  9. 链式线性表和顺序线性表
  10. Stata:刀切法-去一法-Jackknife简介