Java网络编程之实现资源下载详解王道Java

敢说敢作敢为, 无怨无恨无悔。这篇文章主要讲述Java网络编程之实现资源下载详解王道Java相关的知识,希望能为你提供帮助。
@[toc]
一,前言有一个作业需求,如下:
实现用户端输入需要下载的编号【存储在数据库里】,通过TCP连接,发出请求,客户端响应,传输目标文件个用户端。用户端,保存传输过来的文件。
二,实现资源下载功能需求:
1-在服务器的硬盘创建一个目录,目录中存放供客户端下载的资源文件。
2-创建数据库表,表中存放资源文件的编号和资源文件的地址。
我的数据库截图,和服务端目标路径如下图。

Java网络编程之实现资源下载详解王道Java

文章图片

Java网络编程之实现资源下载详解王道Java

文章图片

三,资源下载的客户端功能需求:
1-客户端输入要下载的资源编号
2-将编号发送给服务器
3-接收服务器的资源,保存到文件
【Java网络编程之实现资源下载详解王道Java】服务器的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数组
Java网络编程之实现资源下载详解王道Java

文章图片

连接数据库,执行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");

将读入的数据写入到输出流,通知客户端,传输结束了。
Java网络编程之实现资源下载详解王道Java

文章图片

实验总结:理解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的传输原理。
Java网络编程之实现资源下载详解王道Java

文章图片

Java网络编程之实现资源下载详解王道Java

文章图片

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

文章图片


    推荐阅读