-1

TCP/IP を使用して、あるコンピューターから別のコンピューターにファイルを転送しようとしています。以下に示すように、Javaでコードを記述しました。ただし、コードは機能せず、複数の catch ブロックを使用した後、これは「SocketException」が原因であることがわかりました。誰でもこれを解決する方法を教えてもらえますか? これが私のコードです-

TCPクライアント

 import java.net.*;

java.io をインポートします。; 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)
        {
           ;
        }
  }

}

TCPサーバー

 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");
     }

  }

}

4

1 に答える 1

1

あなたのコードは有用な診断情報をすべて捨てているため、実際の問題の原因を突き止めることはほぼ不可能です。(そして、そんなことを完全に無視IOExceptionするのは犯罪に近い!)

この問題を解決する方法は次のとおりです。

  • 予期しない例外が発生したときに、例外メッセージとスタック トレースを出力するようにプログラムを修正します。
  • プログラムを実行します。
  • 失敗した場合は、診断を調べてその意味を判断するか、問題を質問に追加してください。

接続タイムアウトは通常、ネットワーク レベルで何らかの問題があることを示します。たとえば、接続しようとしているマシンが停止している (または存在しない)、パケットが適切にルーティングされていない、またはファイアウォールによってドロップされているなどです。

しかし、この場合の問題は、(明らかに) を使用"localhost"して別のマシンと通信しようとしていることです。それは単にうまくいきません。名前"localhost"は通常、ループバック サブネット上のアドレスに解決されます。例えば127.0.0.1ループバック トラフィックは、送信元のマシンから離れることはありません。そのため、このマシン"localhost"内の何かに接続するためにのみ使用できます。

(おそらく、このマシンの指定されたポートへの接続をリッスンしているものがないため、接続を開くための TCP パケットがドロップされている可能性があります。最終的に、クライアント側の TCP-IP スタックは接続の試行をタイムアウトし、Javaソケット ライブラリは、表示されている例外をスローします。)

"localhost"解決策は、通信しようとしているコンピューターの DNS 名または IP アドレスに置き換えることです。

于 2013-01-17T03:28:31.857 に答える