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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. public class UploadServer{
  2.         public static void main(String[] args) throws Exception{
  3.                 ServerSocket ss = new ServerSocket(10001);
  4.                 while(true){
  5.                         Socket s = ss.accept();
  6.                         new Thread(new UploadThread(s)).start();
  7.                 }
  8.         }
  9. }
  10. class UploadThread implements Runnable{
  11.         private Socket s;
  12.         UploadThread(Socket s){
  13.                 this.s = s;
  14.         }
  15.         public void run() {
  16.                 String ip = s.getInetAddress().getHostAddress();
  17.                 BufferedInputStream input = null;
  18.                 OutputStream out = null;
  19.                 //此处我想实现一个方法,就是我如果传递给别人我收到数据了,发送给别人我收到信息的的信息
  20.                 PrintWriter pw = null;
  21.                 try {
  22.                         System.out.println(ip+"...connection");
  23.                         input = new BufferedInputStream(s.getInputStream());
  24.                         int len = 0;
  25.                         byte[] by = new byte[1024];
  26.                         StringBuilder sb = new StringBuilder();
  27.                         while((len = input.read(by))!=-1){
  28.                                 sb.append(new String(by,0,len));
  29.                         }
  30.                         String str = sb.toString();
  31.                         //截取通过socket传入数据的名字
  32.                         int end = str.lastIndexOf(":");
  33.                         //得到文件名称
  34.                         String s1 = str.substring(end+1,str.length());
  35.                         //要传递的数据
  36.                         String s2 = str.substring(1,end);
  37.                         File file = new File(s1);
  38.                         out = new FileOutputStream("c:\\123\\"+file);
  39.                         out.write(s2.getBytes());
  40.                         pw = new PrintWriter(s.getOutputStream(),true);
  41.                         pw.print("上传成功");
  42.                 } catch (Exception e) {
  43.                         e.printStackTrace();
  44.                 }finally{
  45.                         //关闭流操作
  46.                         try {
  47.                                 input.close();
  48.                         } catch (IOException e) {
  49.                                 e.printStackTrace();
  50.                         }
  51.                         try {
  52.                                 out.close();
  53.                         } catch (IOException e) {
  54.                                 e.printStackTrace();
  55.                         }
  56.                         try {
  57.                                 s.close();
  58.                         } catch (IOException e) {
  59.                                 e.printStackTrace();
  60.                         }
  61.                 }
  62.         }
  63. }
复制代码
  1. //客户端
  2. public class UploadSocket {
  3.         public static void main(String[] args) {
  4.                 //用于键盘录入
  5.                 BufferedReader bufr = null;
  6.                
  7.                 try {
  8.                         bufr =  new BufferedReader(new InputStreamReader(System.in));
  9.                         System.out.println("输入要传入文件的地址");
  10.                         //读取地址
  11.                         String file= bufr.readLine();
  12.                         File f1 = new File(file);
  13.                         //判断文件是否存在
  14.                         if(!f1.exists()){
  15.                                 System.out.println("源文件不存在");
  16.                                 System.out.println("请重新输入");
  17.                                 file = bufr.readLine();
  18.                                 f1 = new File(file);
  19.                         }
  20.                         System.out.println(f1.getName());
  21.                         //调用方法
  22.                         setSocket(f1);
  23.                        
  24.                 } catch (Exception e) {
  25.                         e.printStackTrace();
  26.                 }finally{
  27.                         //关闭流
  28.                         try {
  29.                                 bufr.close();
  30.                         } catch (IOException e) {
  31.                                 e.printStackTrace();
  32.                         }
  33.                 }
  34.         }
  35.         //用于socket传输文件
  36.         public static void setSocket(File file) {
  37.                 InputStream input = null;
  38.                 OutputStream out = null;
  39.                 Socket s = null;
  40.                 BufferedReader bufIn= null;
  41.                 try {
  42.                         input = new FileInputStream(file);
  43.                         s = new Socket("127.0.0.1", 10001);
  44.                         out = s.getOutputStream();
  45.                         int len = 0;
  46.                         while ((len = input.read()) != -1) {
  47.                                 out.write(len);
  48.                         }
  49.                         //最后在输出文件的名字
  50.                         out.write((":"+file.getName()).getBytes());
  51.                         bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
  52.                         String str = bufIn.readLine();
  53.                         System.out.println(str);
  54.                 } catch (Exception e) {
  55.                         e.printStackTrace();
  56.                 }finally{
  57.                         try {
  58.                                 input.close();
  59.                         } catch (IOException e) {
  60.                                 e.printStackTrace();
  61.                         }
  62.                         try {
  63.                                 out.close();
  64.                         } catch (IOException e) {
  65.                                 e.printStackTrace();
  66.                         }
  67.                         try {
  68.                                 s.close();
  69.                         } catch (IOException e) {
  70.                                 e.printStackTrace();
  71.                         }
  72.                 }
  73.                
  74.         }
  75. }
复制代码
输入要传入文件的地址C:\IP.txt
IP.txt
java.net.SocketException: Connection reset        at java.net.SocketInputStream.read(SocketInputStream.java:189)        at java.net.SocketInputStream.read(SocketInputStream.java:121)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at com.zhang.UploadSocket.setSocket(UploadSocket.java:73)
at com.zhang.UploadSocket.main(UploadSocket.java:49)       
请大神帮忙看看怎么解决这个问题。
       

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

3 个回复

倒序浏览
tcp传输数据
2点:必须要时刻连接
        通过in流读数据,out流输出数据
回复 使用道具 举报
冯超 发表于 2013-9-7 22:18
tcp传输数据
2点:必须要时刻连接
        通过in流读数据,out流输出数据

我知道呀,代码是能执行的,就是UploadServer类中去掉38-41行代码,UploadSocket类中去掉51-53就可以运行,请问怎么解决?具体的操作呢?
回复 使用道具 举报
在UploadServer类中第41行 pw.print("上传成功");中,将print改为println即可。
因为你所使用的printWriter类中,查阅API可知,如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作。
你如果使用print则会导致服务端不会刷新确认信息了,发送不成功,客户端和服务端都处于阻塞状态。
当你把这些行去掉后,程序自然可以运行,因为服务端不再发送确认信息,客户端不会读取确认信息,执行到close方法,两边都不会处于阻塞状态。
我这机器运行你的代码需要调试,时间原因我就没有验证,不过应该就是这个问题,你验证后记得告诉我先下,谢谢啦。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马