私は Swing アプリケーションに取り組んでいましたが、ユーザーがローカル ネットワーク経由でファイルを送信できるオプションを追加したいと思ったとき、いくつかの深刻な問題に直面していました。
ネットワーク経由でファイルを送信するために、Sockets ライブラリを使用してクライアントとサーバー間の接続を作成しました。Client.java のソース コードは次のとおりです。
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 = null;
try{
sock = new Socket("192.168.1.107",1234);
}catch(Exception e){
e.printStackTrace();
e.getCause();
}
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();
}
}
Server.java のソース コードは次のとおりです。
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(1234);
while (true) {
System.out.println("Waiting...");
Socket sock = servsock.accept();
//servsock.set
System.out.println("Accepted connection : " + sock);
// sendfile
File myFile = new File ("C:\\testing\\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();
}
}
}
ご覧のとおり、自分のコンピューターからローカル ネットワークに存在する別のコンピューターに test.txt ファイルを送信したいと考えています。Server.Java と Client.java を実行すると、ターミナルで例外が発生し、接続がタイムアウトしたことが示されます。
java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
Connecting...
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)
at Test.NewClass1.main(Client.java:27)
Exception in thread "main" java.lang.NullPointerException
at Test.Client.main(Client.java:36)
さらに混乱したのは、 Localhost を使用してアプリケーションを実行すると、ファイルtest-copy.txtのコピーが適切に作成され、例外の理由を調べたところ、ファイアウォール特権である可能性があることがわかりました。ポート1234のトランザクションを有効にしましたが、それでも同じエラーが発生しました。
ここで私が求めているのは、それは権限の問題ですか? はいの場合、トランザクションを有効にするために、ファイアウォールまたはルーターの構成として何を設定すればよいですか? 私のコンピューターは管理者として設定されており、宛先も設定されています。オペレーティング システムとして Windows 7 を使用しています。
私の質問が明確になったことを願っています。
ありがとうございました :)。