A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Himoriarty 于 2015-6-10 11:01 编辑

------- <a  target="blank">android培训</a>、<a  target="blank">java培训</a>、期待与您交流! ----------
TCP协议客户端并发上传图片的步骤:
客户端:1、创建Socket服务并指定要连接的主机和端口;
2、建立读取流对象,读取文件数据;
3、获取Socket流中的输出流,将数据写到流中,通过网络发送到服务端;
4、使用socket对象中shutdownOutput方法向服务端发送一个结束标记;
5、获取Socket流中的读取流,读取服务端返回的数据,打印在客户端平台上;
6、关闭读取流资源,关闭客户端,

服务端:
1、建立服务端的Socket服务,并监听一个端口;
2、在循环体内,获取连接过来的客户端对象,通过ServerSocket的accept方法获取,此方法为阻塞式方法;
并新建一个线程,使每一个客户端都拥有自己的线程,在线程内进行读取和输出流数据,将流操作封装在一个类中;
3、此类实现Runnable接口,实现run方法,初始化时传连接过来的客户端对象,通过ServerSocket的accept方法获取,此方法为阻塞式方法;
4、客户端如果发过来数据那么服务端使用对应的客户端对象并获取到该客户端对象的读取流来读取发过来的数据;
5、建立输出流对象,将读取流中的数据写到服务端上。
6、关闭输出流,关闭获取的客户端对象。
个人学习心得:
我在测试时,当以插入网线时连接我的IPv4的IP地址为主机时,无法传输成功,当拔掉网线连接127.0.0.1为主机的时候可以,插上网线还是这个IP地址,就不行了,我采用了第三种IP地址,即本机的本地IPv6地址的时候无论插入网线还是拔掉网线都可以传输成功。不过我还不知道为什么。有知道的可以帮忙解释一下,但是这样的话对本程序会出现一个问题,如果我以IP地址为文件名,存储客户端上传的文件时,会出现异常,因为IPv6中含有违反文件命名的非法字符,所以我采用了IP名的子字符串。
  1. import java.net.*;
  2. import java.io.*;

  3. /*
  4. 需求:实现客户端多线程并发向服务端上传图片。
  5. */
  6. class PicClient2
  7. {
  8.         public static void main(String[] args) throws Exception
  9.         {
  10.                 //此处我没有做那么多的判断
  11.                 File file = new File(args[0]);
  12.         
  13.                 Socket s = new Socket("fe80::58fd:ab7f:707d:dc6a%15",10008);
  14.                
  15.                 FileInputStream fis = new FileInputStream(file);
  16.                
  17.                 OutputStream out = s.getOutputStream();
  18.                
  19.                 byte[] buf = new byte[1024];
  20.                 int len = 0;
  21.                 while((len = fis.read(buf)) != -1)
  22.                 {
  23.                         out.write(buf,0,len);
  24.                 }
  25.                
  26.                 s.shutdownOutput();
  27.                
  28.                 InputStream in = s.getInputStream();
  29.                
  30.                 byte[] bufIn = new byte[1024];
  31.                 int num = in.read(bufIn);
  32.                 System.out.println(new String(bufIn,0,num));
  33.                
  34.                 fis.close();
  35.                 s.close();
  36.         }
  37. }

  38. class PicThread implements Runnable
  39. {
  40.         private Socket s;
  41.         PicThread(Socket s)
  42.         {
  43.                 this.s = s;
  44.         }
  45.         public void run()
  46.         {
  47.                 int count = 1;
  48.                 String ip = s.getInetAddress().getHostAddress();
  49.                 String subip = ip.substring(1,4);
  50.                 try
  51.                 {                        
  52.                         System.out.println(ip +".....connected");
  53.                         
  54.                         InputStream in = s.getInputStream();
  55.                         
  56.                         //此处为讲课中的一点失误,按照正常来说先有***.jpg文件存在
  57.                         //然后如果再有的话上传的话再有***(n).jpg.
  58.                         File file = new File(subip+".jpg"); //此行代码应该这么写。
  59.                         while(file.exists())
  60.                                 file = new File(subip+"("+(count++)+")"+".jpg");
  61.                         
  62.                         
  63.                         
  64.                         FileOutputStream fos = new FileOutputStream(file);
  65.                         byte[] buf = new byte[1024];
  66.                         
  67.                         int len = 0;
  68.                         while((len = in.read(buf))!= -1)
  69.                         {
  70.                                 fos.write(buf,0,len);
  71.                         }
  72.                         
  73.                         OutputStream out = s.getOutputStream();
  74.                         
  75.                         out.write("load Success".getBytes());
  76.                         
  77.                         fos.close();
  78.                         s.close();
  79.                 }
  80.                 catch(Exception e)
  81.                 {
  82.                         throw new RuntimeException(ip+"上传失败");
  83.                 }
  84.         }
  85. }
  86. class PicServer2
  87. {
  88.         public static void main(String[] args) throws Exception
  89.         {
  90.                 ServerSocket ss = new ServerSocket(10008);
  91.                
  92.                 while(true)
  93.                 {
  94.                         Socket s = ss.accept();
  95.                         new Thread(new PicThread(s)).start();
  96.                         
  97.                 }                        
  98.         }
  99. }
复制代码

----------android培训java培训、java学习型技术博客、期待与您交流!------------




2 个回复

倒序浏览
哇!大神,这个我还没学到,看都看不懂
回复 使用道具 举报
q757571446 发表于 2015-6-5 22:57
哇!大神,这个我还没学到,看都看不懂

学到了就看懂了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马