我正在尝试创建一个能够通过网络发送文件的简单类。基本上,这个类在每台机器上创建一次,启动一个单独的监听线程,它可以发送和接收文件。此时我已经硬编码了其他地址(环回)和文件位,以简化测试。
这是我的班级:
public class ConnectionHandler extends Thread{
private ServerSocket sSocket;
private Socket socket;
public ConnectionHandler(){
try {
this.sSocket = new ServerSocket(6533);
this.socket = new Socket("127.0.0.1", 6533);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}
}
public void sendFile(File f) {
try {
int count;
byte[] buffer = new byte[1024];
BufferedInputStream in = new BufferedInputStream(new FileInputStream(f));
OutputStream out = socket.getOutputStream();
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
out.flush();
out.close();
in.close();
socket.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run(){
try {
int count;
byte[] buffer = new byte[1024];
InputStream in = sSocket.accept().getInputStream();
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(location));
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
out.flush();
}
out.close();
in.close();
sSocket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
但是,我遇到了“已在使用中的地址”错误,无法在我的代码中找出问题。另外,我认识到我的'run'线程在一次传输后终止,这是有意进行测试的。我计划实现一个更强大的线程,可以处理多个连接等。
答案 0 :(得分:1)
还有其他东西在听6533端口。netstat
会告诉你什么。
答案 1 :(得分:0)
但是,我遇到了“已在使用中的地址”错误,无法在我的代码中找出问题
您是否有机会分叉多个 ConnectionHandler
个帖子?这将尝试在更多6533上启动多个服务器套接字,第二个将抛出异常。
通常,主线程启动服务器套接字,并在接受连接后分叉ConnectionHandler
。类似的东西:
// main or server thread
ServerSocket serverSocket = new ServerSocket(6533);
try {
while (!shuttingDown) {
Socket socket = serverSocket.accept();
// better would be to use an ExecutorService thread-pool here
new Thread(new ConnectionHandlerRunnable(socket)).start();
}
} finally {
serverSocket.close();
}