黑马程序员——TCP协议传输(下)
2015-09-11 22:45
579 查看
——- android培训、java培训、期待与您交流! ———-
上一篇我们讲了一些TCP传输的概念,以及一些示例程序,我们会发现做这些远远不能满足我们要求。试想一下我们可不可以上传一篇文档或者是一幅图片,甚至一部电影呢!这些对于TCP传输是不成问题的关键如何才能实现,现在同笔者一起去实现吧!
示例一:要求从本地硬盘中找到一一篇文档或一幅图片或一部电影呢,上传到服务器,然后由服务器把文本写到指定位置上,上传完成后服务器发送“发送完成”给客户端
示例一:发送文件给服务器,服务器保存数据在硬盘上
示例一就算可以发文件但却只能发一次,只能接收一个客户端,和服务器服务多个对象是违背的,我们能不能通过多个客户端连接服务器,同时发送文件,让客户端并进行保存呢!这个没有问题的,我们只需要对示例的代码修改成多线程,并且一直让accept()循环下去,有一个客户端收一个客户端,并同时开启线程,来操作,不就可以了,好了看看下面代码
示例二:要求多个客户端发送文件,服务器同时处理多个客户端并将文件写到硬盘上,然后发送反馈信息到发送完成的客户端上,因为以下代码仅仅针对上面程序进行修改,所以相同的语句注释我就不加了
——- 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培训、期待与您交流! ———-
相关文章推荐
- HTTPS那些事(一)HTTPS原理
- Linux基本网络知识
- Linux内核工程导论——网络:内核特性
- Linux内核工程导论——网络:Socket
- 使用dup2重定向了标准输出后,使用什么方法恢复对终端的输出?? http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=359433&page=
- 黑马程序员——TCP协议传输(上)
- dup() 和 dup2() http://blog.163.com/crosslandy@126/blog/static/12798713420119710598844/
- 我的openwrt学习笔记(二十九)webserver之 thttpd
- 1.Linux链接概念 http://www.cnblogs.com/itech/archive/2009/04/10/1433052.html
- fstat、stat和lstat 区别(转) http://www.cnitblog.com/guopingleee/archive/2008/11/13/51411.aspx
- 我的openwrt学习笔记(二十八)webserver之lighttpd
- 腾迅股票数据接口 http/javascript
- android 开发--抓取网页解析网页内容的若干方法(网络爬虫)(正则表达式)
- 网络协议
- 达到HTTP合约Get、Post和文件上传功能——采用WinHttp介面
- Android网络连接---WebView
- 安卓之网络连接
- Android网络编程随想录(2)
- TCP/IP 各层的主要协议及概念
- ios网络编程01