Java中的SocketException:通过TCP / IP传输文件

时间:2013-01-17 02:35:37

标签: java sockets tcp socketexception

我正在尝试使用TCP / IP将文件从一台计算机传输到另一台计算机。我已经用java编写了代码,如下所示。但是,代码不起作用,在使用多个catch块之后,我发现这是由于'SocketException'引起的。任何人都可以告诉我如何解决这个问题?这是我的代码 -

的TcpClient

 import java.net.*;

import java.io. ;    import java.util。;

公共类TCPClient    {

  public static void main (String args[])
  {
     try
     {
        Socket sock = new Socket("localhost", 6839);
        InputStream is = null;
        FileOutputStream out = null;
        boolean doesntexist=false;
        String filename = "D:\\"+"Test"+".pdf";
        System.out.println("Here!");
        File newplaylist = new File(filename);
        doesntexist = newplaylist.createNewFile();

        if(!doesntexist)
        {
           newplaylist.delete();
           newplaylist.createNewFile();
        }


        byte[] mybytearray = new byte[1024];

        is = sock.getInputStream();
                                // Create a new file output stream.
        out = new FileOutputStream(newplaylist);

        int count;
        while ((count = is.read(mybytearray)) >= 0) {
           out.write(mybytearray, 0, count);
        }
        out.close();
        is.close();
        sock.close();
     }      
        catch(SocketException e)
       {
        System.out.println("Socket exception");
       }
        catch(ProtocolException e)
        {
           System.out.println("Protocol exception");
        }
        catch(IOException ds)
        {
           ;
        }
  }

}

TCPSERVER

 import java.util.*;
 import java.io.*;
 import java.net.*;
 import java.nio.channels.*;

 class Fileserver
 {
    public static void main(String args[]) throws IOException
   {
     ServerSocket server = new ServerSocket(6839);
     File myFile = new File("E:\\file1.pdf");
     FileInputStream file = null;
     OutputStream os = null;
     Socket sock=null;

     sock = server.accept();

     try
     {

        byte[] mybytearray = new byte[1024];
        file = new FileInputStream(myFile);
        os = sock.getOutputStream();


        int count;
        while ((count = file.read(mybytearray)) >= 0) {
           os.write(mybytearray, 0, count);

        }

        os.flush();
     }


        catch(IOException e)
        {
           System.out.println("No file");
        }
        catch(IllegalBlockingModeException ea)
        {
           System.out.println("blah!");
        }

     finally
     {
        System.out.println("hello");
        file.close();
        os.close();
        sock.close();

        System.out.println("Socket closed");
     }

  }

}

1 个答案:

答案 0 :(得分:1)

您的代码丢弃了所有有用的诊断信息,这些信息将确定实际问题几乎是不可能的。 (而且完全忽略了IOException就像接近犯罪者一样!)

解决此问题的方法是执行以下操作:

  • 修改程序,以便在发生意外异常时输出异常消息和堆栈跟踪。
  • 运行程序。
  • 如果/何时失败,请检查诊断并确定它们的含义...或将它们添加到问题中,以便我们为您提供帮助。

连接超时通常表示网络级别存在某种问题。例如,您尝试连接的计算机已经死亡(或不存在),数据包未正确路由,或者被防火墙丢弃。

但在这种情况下,问题是你(显然)试图使用"localhost"与另一台机器进行通信。这根本行不通。 "localhost"名称通常解析为环回子网上的地址;例如127.0.0.1。环回流量永远不会离开它发送的机器......因此您只能使用"localhost"连接机器中的某些内容。

(可能发生的事情是,由于没有任何东西正在侦听机器上指定端口的连接,因此打开连接的TCP数据包将被丢弃。最终,客户端TCP- IP堆栈超时连接尝试,Java套接字库抛出您看到的异常。)

解决方案是将"localhost"替换为您尝试与之通话的计算机的DNS名称或IP地址。