2011-01-05 15 views
0

我有不同的IP地址與不同的端口號連接到不同系統的套接字數量。我的問題是我必須在任何系統中運行一個程序來一次傳送所有套接字,並且如何從套接字中並行傳送消息?如何在java中通信多個套接字?

雖然我使用單個套接字,它將正常工作,我從超級終端不斷地收到消息。不止一個連接,然後我得到的第一個反應只..所以請提供解決方案儘快


import java.io.BufferedReader; 
import java.io.DataOutputStream; 
import java.io.InputStreamReader; 
import java.net.Socket; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.HashMap; 
import com.ibatis.sqlmap.client.SqlMapClient; 

public class Client1 extends Thread { 
    static Socket socket; 
    static Socket socket1; 
    static String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss"; 
    static SqlMapClient sqlMap=GetDBConnection.sqlMap; 
    static BufferedReader br = null; 
    static DataOutputStream dos=null; 
    static BufferedReader br1 = null; 
    static DataOutputStream dos1=null; 
    public static void main(String args[]){ 
     try{ 
      String host="192.168.1.151"; 
      int port=5002; 
      String host1="192.168.1.150"; 
      int port1=5001; 
      socket = new Socket(host, port); 
      socket1=new Socket(host1, port1); 
      dos = new DataOutputStream(socket.getOutputStream()); 
      br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      dos1 = new DataOutputStream(socket1.getOutputStream()); 
      br1 = new BufferedReader(new InputStreamReader(socket1.getInputStream())); 

      Thread t = new Thread(new Runnable() { 
      public void run() { 
       while(socket.isConnected()) { 
        try{ 
         HashMap map = new HashMap(); 
         String str = br.readLine(); 
         Calendar cal = Calendar.getInstance(); 
         SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW); 
         String time = sdf.format(cal.getTime()); 
         map.put("data", str); 
         map.put("port", socket.getPort()); 
         map.put("date_time", time); 
         sqlMap.insert("insert", map); 
        } 
        catch(Exception e){ 
         e.printStackTrace(); 
        } 
       } 
       } 
      }); 

      Thread t1 = new Thread(new Runnable() { 
      public void run() { 
       while(socket1.isConnected()) { 
        try{ 
         HashMap map = new HashMap(); 
         String str = br1.readLine(); 
         Calendar cal = Calendar.getInstance(); 
         SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW); 
         String time = sdf.format(cal.getTime()); 
         map.put("data", str); 
         map.put("port", socket1.getPort()); 
         map.put("date_time", time); 
         sqlMap.insert("insert", map); 
        } 
        catch(Exception e){ 
         e.printStackTrace(); 
        } 
        } 
       } 
      }); 

      t.start(); 
      t1.start(); 
      } 
      catch(Exception e){ 
       e.printStackTrace(); 
      } 
    } 
} 

我運行兩個線程的兩個插槽的做工精細,但如果我有100座那我該怎麼做呢?我無法創建線程100的...所以提供最佳解決方案..


public class Client implements Runnable{ 

    public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss"; 
     static BufferedReader br = null; 
     static DataOutputStream dos=null; 
     static Socket socket = null; 
     SqlMapClient sqlMap=GetDBConnection.sqlMap; 

     Client(String host, int port) 
     { 
      try { 

       socket = new Socket(host, port); 
      } catch (UnknownHostException e) { 
         e.printStackTrace(); 
      } catch (IOException e) { 
         e.printStackTrace(); 
      } 
     } 

    public void run() 
    { 
     try { 

      HashMap map = new HashMap(5); 
      String str; 
      int prt=socket.getPort(); 
      dos = new DataOutputStream(socket.getOutputStream()); 
      br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

      while((str=br.readLine())!=null) 
      { 
       Calendar cal = Calendar.getInstance(); 
       SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW); 
       String time = sdf.format(cal.getTime()); 
       map.put("data", str); 

       map.put("port",prt); 
       map.put("date_time", time); 
       sqlMap.insert("insert", map); 
      } 
     } 
      catch(Exception e) 
      { 
       e.printStackTrace(); 
      } 
      finally 
      { 
       try { 

        socket.close(); 
        dos.close(); 
        br.close(); 
       } catch (IOException e) { 
         e.printStackTrace(); 
       } 
      } 
    } 

    public static void main(String args[]) 
    { 
     ResultSet rs=null; 
     Connection con = null; 

     try { 
      Class.forName("org.postgresql.Driver"); 
      con = DriverManager.getConnection("jdbc:postgresql://localhost:5432/Socket","username","passwd"); 
      Statement st=con.createStatement(); 
      String vsql="select port, ip_addr from port_instrument"; 
      rs=st.executeQuery(vsql); 
       while (rs.next()) { 
       String id = rs.getString(1); 

       String ipaddr = rs.getString(2); 

       new Thread(new Client(ipaddr, Integer.parseInt(id))).start(); 

       } 
     } 
     catch(Exception e) 
     { 
     e.printStackTrace(); 
     } 
     finally{ 
      try { 
       con.close(); 
       rs.close(); 
       } catch (SQLException e) { 
        e.printStackTrace(); 
       } 
     } 
    } 
} 

通過使用此代碼,我們可以只用單插槽通信。在我的數據庫中,我有5個套接字,但最終我只從最後一個套接字(5)獲得通信。

+1

使用線程並行處理一個開始。 – Codemwnci 2011-01-05 09:28:02

+0

可以請提供一個例子... – pmad 2011-01-05 09:52:40

回答

1

您可能想要編寫一個實現Runnable並執行所有套接字通信的通信類。然後,您可以爲每個套接字創建一個此類的實例,並在某種線程池中運行這些類。

編輯:這是給你

public class SocketHandler implements Runnable 
{ 
    private Socket socket; 

    public SocketHandler(String host, int port) 
    { 
    socket = new Socket(host, port); 
    } 

    public void run() 
    { 
    //Do the comms to the remote server 
    } 
} 
+0

可以請你提供這種情況下的代碼.. – pmad 2011-01-05 09:54:05

+0

只有一個程序足以從所有套接字獲得通信? – pmad 2011-01-05 10:14:45

+0

請給我提供通過單個程序並行通信多個套接字的方式..預先感謝 – pmad 2011-01-05 10:27:32

0

您需要從不同線程中的每個套接字讀取數據,否則應用程序將阻止偵聽其中一個套接字,即使有其他數據要讀取數據。所以如果你有x套接口,你必須創建從它們讀取的x個線程。

+0

謝謝你。確定它的工作罰款兩個。但是我們不知道有多少個插座會出現,然後? – pmad 2011-01-05 09:50:26

+0

你不需要事先知道這一點。每次你打開一個套接字,你也創建一個線程讀取它。 – 2011-01-05 09:56:12

+0

是的..我做了兩個插座。但我想要它爲更多的插座數 – pmad 2011-01-05 10:07:45