2

ネットワーク経由でファイルを送信するアプリケーションに取り組んでいます。

選択したファイルの送受信に 2 つのクラスを使用しました。

ローカルホストで作業しているときに直面した問題は、プロセスが正しく行われることですが、IP アドレスをネットワーク IP に変更すると機能しません。

これが私が使用している2つのクラスです。

クラス サーバー:

    package Test;

    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;

    public class Server{
 public static void main (String [] args ) throws IOException {
// create socket
ServerSocket servsock = new ServerSocket(41111);
while (true) {
  System.out.println("Waiting...");

  Socket sock = servsock.accept();
  System.out.println("Accepted connection : " + sock);

  // sendfile
  File myFile = new File ("C:\\Users\\Marrah.Zakaria\\Desktop\\test\\test.txt");
  byte [] mybytearray  = new byte [(int)myFile.length()];
  FileInputStream fis = new FileInputStream(myFile);
  BufferedInputStream bis = new BufferedInputStream(fis);
  bis.read(mybytearray,0,mybytearray.length);
  OutputStream os = sock.getOutputStream();
  System.out.println("Sending...");
  os.write(mybytearray,0,mybytearray.length);
  os.flush();
  sock.close();
  }
}
}

クラス クライアント:

 package Test;

 import java.io.BufferedOutputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.Socket;


 public class Client{
 public static void main (String [] args ) throws IOException {
 int filesize=6022386; // filesize temporary hardcoded

 long start = System.currentTimeMillis();
 int bytesRead;
 int current = 0;

Socket sock = new Socket("192.168.1.100",41111);
System.out.println("Connecting...");

 // receive file
 byte [] mybytearray  = new byte [filesize];
 InputStream is = sock.getInputStream();
 FileOutputStream fos = new FileOutputStream("C:\\Test\\test-copy.txt");
 BufferedOutputStream bos = new BufferedOutputStream(fos);
 bytesRead = is.read(mybytearray,0,mybytearray.length);
 current = bytesRead;


do {
   bytesRead =
      is.read(mybytearray, current, (mybytearray.length-current));
   if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);

bos.write(mybytearray, 0 , current);
bos.flush();
long end = System.currentTimeMillis();
System.out.println(end-start);
bos.close();
sock.close();
sock.getPort();
}
}

実行後、例外が表示されます:

Exception in thread "main" java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at            java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:69)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:157)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)

それを取り除くために私は何をすべきか教えてください。


受信者のファイアウォールを無効にすると、別の例外が発生しました:

 Exception in thread "main" java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:69)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:157)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
4

3 に答える 3

2

サーバーを立ち上げたらtelnet、この組み合わせにできますか?

telnet 192.168.1.100 41111

ルーティングに問題がある場合はすぐにわかります(telnet接続を拒否します)

于 2012-10-09T14:22:12.383 に答える
1

また、クライアントを実行しているマシンから 192.168.1.100 への ping を試みます (つまり、Windows ボックスを使用している場合はコマンド プロンプトから)。

于 2012-10-09T14:27:41.647 に答える
1

ネットワーク上にカスタム ポート (41111) をブロックしているファイアウォールがあるかどうかを確認しましたか (Windows ファイアウォールも確認してください)。

これは、タイムアウトが発生したときに最初に確認することです。

于 2012-10-09T14:21:10.977 に答える