2014-04-14 18 views
0

我试图玩并发包,为此我试图写一个简单的套接字处理程序。以下是代码:使用conccurent包的java中的异步套接字处理仍会阻止代码?

import java.io.*; 
import java.net.*; 
import java.util.*; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

public class MultiThreadedServer{ 
    private final static int number_of_threads = 4; 
    private final static int port = 1134; 

    public static void main(String[] args){ 
    try{ 
     ServerSocket ss = new ServerSocket(port); 
     ExecutorService pool = Executors.newFixedThreadPool(number_of_threads); 
     for(;;){ 
     pool.execute(new SocketHandler(ss.accept())); 

     }  
    }catch(Exception e){ 
     System.out.println(e.toString()); 

    } 

    } 

} 

class SocketHandler implements Runnable { 

    private Socket socket; 


    SocketHandler(Socket s){ 
    this.socket = s; 
    System.out.println("-- Socket has connected -- "); 


    } 

    public void run(){ 
    try{ 
     BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     String s = ""; 
     while((s = reader.readLine()) != null ){ 
     System.out.println(s); 
     } 
    }catch(Exception e){ 
     System.out.println(e.toString()); 
    } 
    } 

} 

此代码^^只是等待套接字并读取套接字发送的任何内容。它在一定程度上工作正常。 (稍后我会解释什么困扰我)。

下面的代码是一个“发送”插槽

import java.io.*; 
import java.net.*; 


public class Sender{ 

    public static void main(String args[]){ 
    try{ 
     int port = Integer.parseInt(args[0]); 
     Socket socket = new Socket(InetAddress.getByName(null),port); 
     PrintWriter writer = new PrintWriter(socket.getOutputStream()); 
     writer.write("Wohoo!"); 
     writer.close(); 
    }catch(Exception e){ 

     System.out.println(e.toString()); 

    } 
    } 


} 

代码编译罚款,甚至当我运行我的发送者运行良好发件人类。但是,如果我输入

java Sender 

约3次第二,我尝试它运行到我的控制台下面的事情会打印:

java.net.BindException: Address already in use 

但是这个代码的整点是为了不遮挡连接到我的端口并排列任务。我该如何解决这个问题?

+0

尝试关闭发件人中的套接字? – Affe

+0

什么引发异常?给出完整的堆栈跟踪。 – akostadinov

+0

等一下。看起来我的所有插座都被拒绝了。我会尽快处理这件事 – Bula

回答

0

查看我的评论。但我认为你看到的是耗尽你的TCP端口。在开始打印已经使用的端口之前,您是否运行了一段时间?如果是这样,请阅读。

所以关闭一个套接字后,状态为TIME_WAIT。在它通过之前,除非已设置套接字选项SO_REUSEADDR,否则不能重用相同的端口。

因此您需要使用该选项。看到这个答案更深入: https://stackoverflow.com/a/14388707/520567