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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jiangyutc 中级黑马   /  2014-2-15 18:22  /  913 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 jiangyutc 于 2014-2-16 12:14 编辑
  1. package com.itheima;

  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8. import java.net.ServerSocket;
  9. import java.net.Socket;

  10. public class Test9_ServerSocket {

  11.         
  12.         public static void main(String[] args) throws IOException {
  13.                
  14.                 //创建文件对象来并确定客户端上传的文件的存放地址
  15.                 File file = new File("..\\exam_入学\\文件\\复制.doc");
  16.                
  17.                 //利用文件输出流在文件对象上写数据
  18.                 FileOutputStream fos = null;
  19.                 try {
  20.                         fos = new FileOutputStream(file);
  21.                 } catch (FileNotFoundException e2) {
  22.                         // TODO Auto-generated catch block
  23.                         e2.printStackTrace();
  24.                 }
  25.                
  26.                 //创建服务端的Socket流
  27.                 ServerSocket ss = null;
  28.                 try {
  29.                         ss = new ServerSocket(10000);
  30.                 } catch (IOException e) {
  31.                         // TODO Auto-generated catch block
  32.                         e.printStackTrace();
  33.                 }
  34.                
  35.                 //获取客户端的Socket流对象
  36.                 Socket s = null;
  37.                 try {
  38.                         s = ss.accept();
  39.                 } catch (IOException e) {
  40.                         // TODO Auto-generated catch block
  41.                         e.printStackTrace();
  42.                 }
  43.                
  44.                 //获取Socket流字符输入流,用来接受数据
  45.                 InputStream bs = null;
  46.                 try {
  47.                         bs = s.getInputStream();
  48.                 } catch (IOException e) {
  49.                         // TODO Auto-generated catch block
  50.                         e.printStackTrace();
  51.                 }
  52.                
  53.                 byte[] b = new byte[1024];
  54.                 int len = 0;
  55.                 while(!((len = bs.read(b)) == -1)){
  56.                         
  57.                         fos.write(b,0,len);
  58.                 }
  59.                
  60.                 OutputStream os = s.getOutputStream();
  61.                 os.write("传输成功......".getBytes());
  62.                
  63.                 try {
  64.                         s.close();
  65.                 } catch (IOException e1) {
  66.                         // TODO Auto-generated catch block
  67.                         e1.printStackTrace();
  68.                 }
  69.                
  70.                 try {
  71.                         ss.close();
  72.                 } catch (IOException e) {
  73.                         // TODO Auto-generated catch block
  74.                         e.printStackTrace();
  75.                 }
  76.         }
  77. }
复制代码

  1. package com.itheima;

  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8. import java.net.InetAddress;
  9. import java.net.Socket;
  10. import java.net.UnknownHostException;


  11. public class Test9_Socket {

  12.         public static void main(String[] args) throws Exception {
  13.                
  14.                 //创建文件对象
  15.                 File file = new File("..\\exam_入学\\文件\\java面试宝典2013版.doc");
  16. //                File file = new File("D:\\1.txt");
  17.                 //创建文件对象输入流并抛出异常
  18.                 FileInputStream ios = null;
  19.                 try {
  20.                         ios = new FileInputStream(file);
  21.                 } catch (FileNotFoundException e2) {
  22.                         System.out.println("该文件不存在");
  23.                 }               
  24.                
  25.                
  26.                 //因为服务端在本地主机上,所以要获取本地主机
  27.                 InetAddress ia = null;
  28.                 try {
  29.                         ia = InetAddress.getLocalHost();
  30.                 } catch (UnknownHostException e1) {
  31.                         System.out.println("如果找不到 host 的任何 IP 地址");
  32.                 }
  33.                 //获取本地的IP地址
  34.                 String ip = ia.getHostAddress();
  35.                 //根据服务器的IP地址和端口,创建Socket流用来连接服务器并抛出异常
  36.                 Socket s = null;
  37.                 try {
  38.                         s = new Socket(ip,10000);
  39.                 } catch (UnknownHostException e1) {
  40.                         System.out.println("如果找不到 host 的任何 IP 地址");
  41.                 } catch (IOException e1) {
  42.                         System.out.println("创建套接字时发生 I/O 错误");
  43.                 }               
  44.                
  45.                
  46.                 //获取Socket流中的输出流,用来上传数据
  47.                 OutputStream os = null;
  48.                 try {
  49.                         os = s.getOutputStream();
  50.                 } catch (IOException e) {
  51.                         System.out.println("创建输出流时发生 I/O 错误或者没有连接套接字");
  52.                 }
  53.                
  54.                 //创建数组用来提高上传效率
  55.                 byte[] b = new byte[1024];
  56.                
  57.                 int len = 0;                        
  58.                 while(!((len = ios.read(b)) == -1)){                                
  59.                                                                         
  60.                         try {
  61.                                 os.write(b,0,len);
  62.                         } catch (IOException e) {
  63.                                 // TODO Auto-generated catch block
  64.                                 e.printStackTrace();
  65.                         }
  66.                 }        
  67.                
  68.                 byte[] b1 = new byte[1024];
  69.                 int len1 = 0;
  70.                 InputStream is = s.getInputStream();
  71.                 len = is.read(b);
  72.                 String text = new String(b1,0,len1);
  73.                 System.out.println(text);
  74.                
  75.                 s.close();
  76.                
  77.         }
  78. }
复制代码


这上面的代码复制文件没问题,但是给客户端反馈信息的时候就卡着不动了。。。。必须要关闭客户端的控制台才能复制成功。。。。
怎么回事???
各位大神求教

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

2 个回复

倒序浏览
客户端第71行加上s.shutdownOutput();//这个是卡死的唯一的原因
客户端第75行把b改成b1//虽然这个是小问题,但是会出现接收不到反馈信息
客户端第76行把len1改成len
客户端的文件读取流没有关,最好关掉
服务端的FileOutputStream这个流与服务器无关,需要关掉
太多小问题

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
panzhenglian 发表于 2014-2-15 23:22
客户端第71行加上s.shutdownOutput();//这个是卡死的唯一的原因
客户端第75行把b改成b1//虽然这个是小问题, ...

多谢多谢,非常感谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马