• 利用Socket 客户端---->服务端 传送文件到指定路径,并返回一个友好的回馈


    首先盲写的一个传输文件的方法,但测试发现了一个非常不容易发现的问题,这里先说明一下。

    错误的代码如下:

      1 package com.TCP.java;
      2 
      3 import java.io.File;
      4 import java.io.FileInputStream;
      5 import java.io.FileNotFoundException;
      6 import java.io.FileOutputStream;
      7 import java.io.IOException;
      8 import java.io.InputStream;
      9 import java.io.OutputStream;
     10 import java.net.InetAddress;
     11 import java.net.ServerSocket;
     12 import java.net.Socket;
     13 
     14 import org.junit.Test;
     15 
     16 //从客户端发送文件给服务端,服务端保存到本地。并返回“发送成功”给客户端。并关闭相应的连接。
     17 public class TestTCP3 {
     18     //客户端
     19     @Test
     20     public void client(){
     21         Socket socket = null;
     22         OutputStream os = null;
     23         FileInputStream fis = null;
     24         InputStream is = null;
     25         try {
     26             //创建一个Socket的对象
     27             socket = new Socket(InetAddress.getByName("192.168.1.101"),9090);
     28             //从本地获取一个文件发送给服务端
     29             os = socket.getOutputStream();
     30             fis = new FileInputStream(new File("findLei.jpg"));
     31             byte[] b = new byte[1024];
     32             int length;
     33             while((length = fis.read(b)) != -1){
     34                 os.write(b,0,length);
     35             }
     36             socket.shutdownOutput();
     37             //接收来自服务端的信息
     38             is = socket.getInputStream();
     39             byte[] b1 = new byte[1024];
     40             int length1;
     41             while((length1 = is.read(b1)) != -1){
     42                 String str = new String(b1,0,length1);
     43                 System.out.println(str);
     44             }
     45         }catch (IOException e) {
     46             e.printStackTrace();
     47         }
     48         finally{
     49             //关闭相应的流和Socket对象
     50             if(is != null){
     51                 try {
     52                     is.close();
     53                 } catch (IOException e) {
     54                     e.printStackTrace();
     55                 }
     56             }
     57             if(fis != null){
     58                 try {
     59                     fis.close();
     60                 } catch (IOException e) {
     61                     e.printStackTrace();
     62                 }
     63             }
     64             if(os != null){
     65                 try {
     66                     os.close();
     67                 } catch (IOException e) {
     68                     e.printStackTrace();
     69                 }
     70             }
     71             if(socket != null){
     72                 try {
     73                     socket.close();
     74                 } catch (IOException e) {
     75                     e.printStackTrace();
     76                 }
     77             }
     78         }
     79     }
     80     
     81     //服务端
     82     @Test
     83     public void server(){
     84         ServerSocket ss = null;
     85         Socket s = null;
     86         InputStream is = null;
     87         FileOutputStream fos = null;
     88         OutputStream os = null;
     89         try {
     90             //创建一个ServerSocket的对象
     91             ss = new ServerSocket(9090);
     92             //调用accept()方法,返回一个Socket对象
     93             s = ss.accept();
     94             //将从客户端发送的信息保存到本地
     95             is = s.getInputStream();
     96             fos = new FileOutputStream("D:/Test");
     97 //            Random random = new Random();
     98 //            fos = new FileOutputStream("D:/Test/" + String.valueOf(random.nextInt(90)) + ".jpg");
     99 //            fos = new FileOutputStream("find2.jpg");
    100             byte[] b = new byte[1024];
    101             int length;
    102             while((length = is.read(b)) != -1){
    103                 fos.write(b, 0, length);
    104             }
    105             //发送接收成功的消息
    106             os = s.getOutputStream();
    107             os.write("接收成功".getBytes());
    108         } catch (FileNotFoundException e) {
    109             e.printStackTrace();
    110         } catch (IOException e) {
    111             e.printStackTrace();
    112         }
    113         finally{
    114             //关闭相应的流及ServerSocket,Socket对象
    115             if(os != null){
    116                 try {
    117                     os.close();
    118                 } catch (IOException e) {
    119                     e.printStackTrace();
    120                 }
    121             }
    122             if(fos != null){
    123                 try {
    124                     fos.close();
    125                 } catch (IOException e) {
    126                     e.printStackTrace();
    127                 }
    128             }
    129             if(is != null){
    130                 try {
    131                     is.close();
    132                 } catch (IOException e) {
    133                     e.printStackTrace();
    134                 }
    135             }
    136             if(s != null){
    137                 try {
    138                     s.close();
    139                 } catch (IOException e) {
    140                     e.printStackTrace();
    141                 }
    142             }
    143             if(ss != null){
    144                 try {
    145                     ss.close();
    146                 } catch (IOException e) {
    147                     e.printStackTrace();
    148                 }
    149             }
    150         }
    151     }
    152 }


    有看出来问题么,没有,看着一点问题也没有,但执行的时候就是报错,而且报错的位置着实很头痛,在那附近找了很久也没找到......

    下面是所报Error的信息

     1 java.net.SocketException: Software caused connection abort: socket write error
     2     at java.net.SocketOutputStream.socketWrite0(Native Method)
     3     at java.net.SocketOutputStream.socketWrite(Unknown Source)
     4     at java.net.SocketOutputStream.write(Unknown Source)
     5     at com.TCP.java.TestTCP3.client(TestTCP3.java:35)
     6     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     7     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
     8     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
     9     at java.lang.reflect.Method.invoke(Unknown Source)
    10     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    11     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    12     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    13     at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    14     at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    15     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    16     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    17     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    18     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    19     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    20     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    21     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    22     at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    23     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    24     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    25     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    26     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
    27     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    28     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)


    指定的位置是35行写入的问题,但是找了很久也没找到原因,还要感谢我大姚哥帮我找到了这个问题

    先说明一下这个Error的意思,大概就是Socket在写入的时候出现故障了,调查这段代码的过程就不一一详述了,就说一下真正的原因在哪,真正的原因是server端需要写入的文件夹目录有问题,我写的是fos = new FileOutputStream("D:/Test");这个路径在直接写入文件的时候有问题,这里进行复制的时候需要指定其格式,及其命名,这个路径明显缺少这两样,而如果改成相对路径就没有那么麻烦了,fos = new FileOutputStream("find2.jpg");这样执行就成功了,但如果我们想将文件放在指定目录下呢,可以用这种方式

    Random random = new Random();

    fos = new FileOutputStream("D:/Test/" + String.valueOf(random.nextInt(90)) + ".jpg")

    这种方式可以自动添加一个随机数,使其避免了重命名的风险,反正问题是已经解决了,成功代码只需打开注释即可

    下面说明一下此Socket传输需要进行的操作及实现的功能

    1.先开启服务端

    2.再启动客户端。其中这里有两个参数是需要手动改的,一个是IP,即你想要传输到的电脑(这台电脑要启动server)的IP;另一个就是端口号,这个是自己随便命名的,像Tomcat一样也需要一个端口号(Tomcat是8080)。

    3.成功复制文件并打印友好回馈

    *4.第二天在同一局域网上的两台机器上测试,竟然不好使,尚未未找到原因,看到这篇博客的希望给点儿建议~

  • 相关阅读:
    vue动态绑定class的几种方式
    寒假阅读笔记之《人月神话》
    人月神话阅读笔记1
    寒假阅读笔记之《构建之法》2
    寒假阅读笔记之《构建之法》
    家庭记账本APP(7)
    家庭记账本APP(6)
    家庭记账本APP(5)
    家庭记账本APP(4)
    家庭记账本APP(3)
  • 原文地址:https://www.cnblogs.com/gode/p/5808618.html
Copyright © 2020-2023  润新知