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
但是这个代码的整点是为了不遮挡连接到我的端口并排列任务。我该如何解决这个问题?
尝试关闭发件人中的套接字? – Affe
什么引发异常?给出完整的堆栈跟踪。 – akostadinov
等一下。看起来我的所有插座都被拒绝了。我会尽快处理这件事 – Bula