文章目录
一,前言
有一个作业需求,如下:
实现用户端输入需要下载的编号【存储在数据库里】,通过TCP连接,发出请求,客户端响应,传输目标文件个用户端。用户端,保存传输过来的文件。
二,实现资源下载
功能需求:
1-在服务器的硬盘创建一个目录,目录中存放供客户端下载的资源文件。
2-创建数据库表,表中存放资源文件的编号和资源文件的地址。
我的数据库截图,和服务端目标路径如下图。
三,资源下载的客户端
功能需求:
1-客户端输入要下载的资源编号
2-将编号发送给服务器
3-接收服务器的资源,保存到文件
服务器的ip,本机:
InetAddress ip=InetAddress.getLocalHost();Socket client=newSocket(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=newFile("E:/tcpcont/client/"+name+".jpg");
使用io流。保存文件。下载完成
FileOutputStream fos=newFileOutputStream(file);byte[]buf=newbyte[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=newServerSocket(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,资源下载的客户端
packagework2;importjava.io.*;importjava.net.InetAddress;importjava.net.Socket;importjava.net.UnknownHostException;importjava.util.Scanner;publicclass client {publicstaticvoidmain(String[] args)throwsIOException{int port=10010;//服务器的ip,本机InetAddress ip=InetAddress.getLocalHost();Socket client=newSocket(ip, port);//向服务器发送资源编号//编号---键盘输入String no;//编号String name;Scanner scanner=newScanner(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=newFile("E:/tcpcont/client/"+name+".jpg");FileOutputStream fos=newFileOutputStream(file);byte[]buf=newbyte[1024*10];int len;while((len=in.read(buf))!=-1){
fos.write(buf,0,len);}
fos.close();
client.close();System.out.println("下载完成");}}
5,2 ,资源下载的服务器端
packagework2;importwork2067111119.UserDAO;importjava.io.*;importjava.net.InetAddress;importjava.net.ServerSocket;importjava.net.Socket;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.HashMap;publicclass server {static dao service =newdao();publicstaticvoidmain(String[] args)throwsIOException,SQLException{//声明自己的端口int port=10010;//服务器的ip,本机InetAddress ip=InetAddress.getLocalHost();ServerSocket server=newServerSocket(port);//~~~~~~~~~~~~~~~~//接收while(true){System.out.println("接收一个客户端");Socket client=server.accept();//接收一个资源编号String no;//编号//获取输入流InputStream in=client.getInputStream();byte[]buf=newbyte[1024];int len=in.read(buf);//将流中的数据读入到buf数组
no=newString(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=newFile(url);FileInputStream fis=newFileInputStream(file);OutputStream out=client.getOutputStream();byte[] fbuf=newbyte[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连接,发出请求,客户端响应,传输目标文件个用户端。用户端,保存传输过来的文件。
版权归原作者 上进小菜猪 所有, 如有侵权,请联系我们删除。