2013-07-07 23 views
0

好日子,阻止正在打開/正在使用的java套接字

我在java中有一個sendMessage函數,看起來像這樣。它目前作爲靜態方法可以被任何線程操作(例如HTTP請求)調用。但是,如果我要同時發送兩個請求,則其中一個sendMessage請求會引發「連接重置」。

我需要知道我目前的端口和ip正在使用!這樣我就不會重置連接,而是等待它再次變爲可用。有沒有辦法?

private static String sendMessage(int command,String data,int port,String ip){ 
    try{ 
     String sendString=Integer.toString(command)+":"+data+'$'+'\n'; 
     BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
     Socket clientSocket = new Socket(); 
     InetAddress addr = InetAddress.getByName(ip); 
     SocketAddress sockaddr = new InetSocketAddress(addr, port); 
     clientSocket.connect(sockaddr, 20000); 

     DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
     BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     outToServer.writeBytes(sendString); 
     String rcvString = inFromServer.readLine(); 
     System.out.println("FROM DEVICE: " + rcvString); 
     clientSocket.close(); 
     return rcvString; 
    }catch(Exception e){ 
     System.err.println(e.getMessage()); 
    } 

    return NULL; 
} 
+0

我不認爲你有你的客戶端代碼有問題。相反,我懷疑你沒有爲服務器端的每個連接創建線程。 –

+1

使你的方法'同步'爲'私有同步靜態字符串sendMessage' – 2013-07-07 13:51:30

+0

那會做什麼?好的,我正在使用servlet。所以每個servlet請求都是根據jetty doc在它自己的線程中處理的。 – raaj

回答

0

好吧我只是想到了一個巧妙的解決方案,但它很醜。

擁有blockChecker類

public class BlockerCheck { 

List<String> blockerList; 

public BlockerCheck(){ 
    blockerList=new ArrayList<String>(); 
} 

public synchronized void addBlock(String ip,int port){ 
    String finalString=ip+":"+Integer.toString(port); 
    blockerList.add(finalString); 
} 

public synchronized void removeBlock(String ip,int port){ 
    String finalString=ip+":"+Integer.toString(port); 
    blockerList.remove(finalString); 
} 

public synchronized boolean isAvailable(String ip,int port){ 
    String finalString=ip+":"+Integer.toString(port); 
    System.out.println("SIZE:" +blockerList.size()); 
    return !(blockerList.contains(finalString)); 
} 
} 

然後用它作爲這樣的:

private static String sendMessage(int command,String data,int port,String ip){ 
    if(blockerCheck.isAvailable(ip, port)) blockerCheck.addBlock(ip, port); 
    else{ 
     long startTime=TimeUnit.SECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS); 
     while(!(blockerCheck.isAvailable(ip, port))){ 
      long currTime=TimeUnit.SECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS); 
      if((currTime-startTime)>10) return null; //ensure null handled 
     } 
    } 
     //SENDING CODE HERE 
     blockerCheck.removeBlock(ip, port); 
} 
+0

我想一些意見。我是否需要包含sendMessage的同步標籤? – raaj

相關問題