黑马程序员——TCP协议传输(下)
来源:互联网 发布:python哪些教程比较好 编辑:程序博客网 时间:2024/06/01 20:52
——- android培训、java培训、期待与您交流! ———-
上一篇我们讲了一些TCP传输的概念,以及一些示例程序,我们会发现做这些远远不能满足我们要求。试想一下我们可不可以上传一篇文档或者是一幅图片,甚至一部电影呢!这些对于TCP传输是不成问题的关键如何才能实现,现在同笔者一起去实现吧!
示例一:要求从本地硬盘中找到一一篇文档或一幅图片或一部电影呢,上传到服务器,然后由服务器把文本写到指定位置上,上传完成后服务器发送“发送完成”给客户端
分析:上传文档可以用FileReader或FileInputStream来读取数据,然而图片,电影却是二进制数据,只能用FileInputStream,所以这里我们统一采用FileInputStream来读取硬盘中数据, 文件由二部分构成,文件名和文件内容,所以我打算用发名称时用 new BufferedReader(new InputStreamReader(input)); 来发送文本数据,当服务器接受到文件名后,返回“收到”,我们开始发字节数据, 发送完成后客户端要shutOutputStream来关闭输出流,同时让服务器知道发送的数据结束, 即文件发送完成,然后发送“发送完成”给客户端。
示例一:发送文件给服务器,服务器保存数据在硬盘上
//服务器import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.ServerSocket;import java.net.Socket;public class ServerSocketDemoTwo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ServerSocket ss; //防止文件同名覆盖 int count = 0; try { ss = new ServerSocket(10000); System.out.println("server wait............"); //等待客户端 Socket s = ss.accept(); try { //获取客户端输入流 InputStream input = s.getInputStream(); //获取客户端输出流 OutputStream output = s.getOutputStream(); //用于接收文件名 BufferedReader fis = new BufferedReader(new InputStreamReader(input)); BufferedWriter fos = new BufferedWriter(new OutputStreamWriter(output)); String line = fis.readLine(); String fileName; //读取文件名 if(line!=null){ fileName = line; //收到文件名后给客户端说一声收到文件名了,可以发数据了 fos.write("rece"); fos.newLine(); fos.flush(); //防止文件同名覆盖 File f = new File(fileName); while(f.exists()){ f = new File("(重复"+count+++")"+fileName); } //开始接受文件 FileOutputStream fileOut = new FileOutputStream(f.getName()); byte []buf = new byte[1024]; int len; //只有当客户羰shutDownOutputStream才会返回-1 while((len=input.read(buf))!=-1){ fileOut.write(buf, 0, len); } //给客户端提醒一下 fos.write("文件写完成!"); fos.newLine(); fos.flush(); //文件写结束 fileOut.close(); fos.close(); s.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }}
//客户端import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.Socket;import java.net.UnknownHostException;/* * 客户端给服务器发送文件,服务器接并保存 */public class SocketDemoTwo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Socket s =null; try { //建立边接 s = new Socket("127.0.0.1",10000); //获取输入流 InputStream input = s.getInputStream(); //获取输出流 OutputStream output = s.getOutputStream(); //发送文件名 BufferedWriter fos = new BufferedWriter(new OutputStreamWriter(output)); BufferedReader fis = new BufferedReader(new InputStreamReader(input)); //"c:\\puke\\nazi.jpg" //要发送的文件可以进行自定义,无论文本,图片,电影全部没问题 File file = new File("c:\\puke\\CSDN.txt"); //如果要发送文件存在我们才进行下一步 if(file.exists()){ fos.write(file.getName()); fos.newLine(); fos.flush(); String line = null; if((line=fis.readLine())!=null){ //收到服务端的消息,如果正确,发送文件 if(line.equals("rece")){ FileInputStream fileInput = new FileInputStream(file); byte []buf = new byte[1024]; int len; while((len=fileInput.read(buf))!=-1){ //发送数据 output.write(buf, 0, len); } //关闭写入流 fileInput.close(); //关闭输出流 s.shutdownOutput(); String info = fis.readLine(); //发送完成 if(!info.equals(null)){ System.out.println(info); } //关闭输出流 s.close(); } } } } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
示例一就算可以发文件但却只能发一次,只能接收一个客户端,和服务器服务多个对象是违背的,我们能不能通过多个客户端连接服务器,同时发送文件,让客户端并进行保存呢!这个没有问题的,我们只需要对示例的代码修改成多线程,并且一直让accept()循环下去,有一个客户端收一个客户端,并同时开启线程,来操作,不就可以了,好了看看下面代码
示例二:要求多个客户端发送文件,服务器同时处理多个客户端并将文件写到硬盘上,然后发送反馈信息到发送完成的客户端上,因为以下代码仅仅针对上面程序进行修改,所以相同的语句注释我就不加了
//服务器import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.ServerSocket;import java.net.Socket;public class ServerSocketDemoTwo { static class DealSockets implements Runnable{ private Socket s; private int count = 1; public DealSockets(Socket s){ this.s = s; } @Override public void run() { // TODO Auto-generated method stub System.out.println("server conntected..."+s.getInetAddress().getHostAddress()); try { InputStream input = s.getInputStream(); OutputStream output = s.getOutputStream(); BufferedReader fis = new BufferedReader(new InputStreamReader(input)); BufferedWriter fos = new BufferedWriter(new OutputStreamWriter(output)); String line = fis.readLine(); String fileName; //读取文件名 if(line!=null){ fileName = line; fos.write("rece"); fos.newLine(); fos.flush(); File f = new File(fileName); while(f.exists()){ f = new File("(重复"+count+++")"+fileName); } //开始接受文件 FileOutputStream fileOut = new FileOutputStream(f.getName()); byte []buf = new byte[1024]; int len; while((len=input.read(buf))!=-1){ fileOut.write(buf, 0, len); } fos.write("文件写完成!"); fos.newLine(); fos.flush(); //文件写结束 fileOut.close(); fos.close(); s.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ServerSocket ss; try { ss = new ServerSocket(10000); System.out.println("server wait............"); while(true){ //通过循环有一个对象记录一个 Socket s = ss.accept(); //开启线程并将对象传入其中代码一样只是加了一个线程 new Thread(new DealSockets(s)).start(); } } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }}
//客户端import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.Socket;import java.net.UnknownHostException;/* * 客户端给服务器发送文件,服务器接并保存 */public class SocketDemoTwo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Socket s =null; try { //建立边接 s = new Socket("127.0.0.1",10000); //获取输入流 InputStream input = s.getInputStream(); //获取输出流 OutputStream output = s.getOutputStream(); //发送文件名 BufferedWriter fos = new BufferedWriter(new OutputStreamWriter(output)); BufferedReader fis = new BufferedReader(new InputStreamReader(input)); //"c:\\puke\\nazi.jpg" //要发送的文件可以进行自定义,无论文本,图片,电影全部没问题 File file = new File("c:\\puke\\CSDN.txt"); //如果要发送文件存在我们才进行下一步 if(file.exists()){ fos.write(file.getName()); fos.newLine(); fos.flush(); String line = null; if((line=fis.readLine())!=null){ //收到服务端的消息,如果正确,发送文件 if(line.equals("rece")){ FileInputStream fileInput = new FileInputStream(file); byte []buf = new byte[1024]; int len; while((len=fileInput.read(buf))!=-1){ //发送数据 output.write(buf, 0, len); } //关闭写入流 fileInput.close(); //关闭输出流 s.shutdownOutput(); String info = fis.readLine(); //发送完成 if(!info.equals(null)){ System.out.println(info); } //关闭输出流 s.close(); } } } } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
——- android培训、java培训、期待与您交流! ———-
0 0
- 黑马程序员——TCP协议传输(下)
- 黑马程序员——TCP协议传输(上)
- 黑马程序员——TCP传输
- 黑马程序员——30,TCP传输
- 黑马程序员—–UDP协议传输
- 黑马程序员——java网络编程中的传输协议:UDP和TCP
- 黑马程序员 TCP传输
- 黑马程序员---TCP传输
- 黑马程序员-TCP传输
- 黑马程序员 Java网络传输UDP和TCP协议
- 黑马程序员-------网络编程中Tcp传输协议
- 黑马程序员——java TCP传输演示
- 黑马程序员——网络编程(TCP传输)
- 黑马程序员——网络编程之TCP传输
- 黑马程序员——TCP和UDP传输
- 黑马程序员——自学笔记15(网络传输2—UDP传输和TCP传输)
- 黑马程序员-TCP传输数据
- 传输层协议——TCP协议
- 计算2点之间的距离
- 【leetcode】Largest Number --C++
- 黑马程序员——ios基础---练习:1
- "catalog" 与 "category" 的区别
- redis常用命令、常见错误、配置技巧
- 黑马程序员——TCP协议传输(下)
- SOA工程部署时报错:MDS-00054 (composite.xml does not exist)
- 黑马程序员——ios开发基础之C语言预处理命令与文件操作
- ‘tools.jar’ seems to be not in Android Studio classpath解决方法
- 《剑指offer》连续子数组的最大和
- 黑马程序员——ios基础---练习:2
- 集合对象中是线程安全
- adapter刷新
- iOS lipo 判断静态库是否支持64位