Java:地址已在使用中

时间:2013-12-18 00:08:16

标签: java multithreading sockets networking

我正在尝试创建一个能够通过网络发送文件的简单类。基本上,这个类在每台机器上创建一次,启动一个单独的监听线程,它可以发送和接收文件。此时我已经硬编码了其他地址(环回)和文件位,以简化测试。

这是我的班级:

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'线程在一次传输后终止,这是有意进行测试的。我计划实现一个更强大的线程,可以处理多个连接等。

2 个答案:

答案 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();
}