2011-01-05 8 views
0

異なるポート番号の異なるIPアドレスを持つ異なるシステムに接続されているソケットの数があります。私の質問は、一度にすべてのソケットを通信する任意のシステムで1つのプログラムを実行しなければならないと私はどのようにソケットからのメッセージを並行して取得できますか?Javaで複数のソケットを通信する方法は?

私はシングルソケットを使用していますが、正常に動作し、ハイパーターミナルからメッセージが連続的に取得されています。私は100個のソケットを持っている場合、最初の1から複数の接続、その後、私は取得しています応答は...そうできるだけ早く


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

は、私は2つのソケットにその作業罰金のための2つのスレッドを実行しているソリューションを提供しますが、してくださいどうすればいいですか?私たちは、単一のソケットと通信することができ、このコードを使用することにより...スレッドの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

+0

は例を提供してください... – pmad

答えて

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

+0

プログラムはすべてのソケットからの通信を取得するのに十分ですか? – pmad

+0

私は複数のソケットを1つのプログラムで並列に通信する方法を教えてください。事前に感謝してください – pmad

0

別のスレッドで各ソケットから読み取る必要があります。そうでなければ、他のスレッドで読み取られるデータがあっても、アプリケーションはソケットの1つでリッスンをブロックします。だから、もしあなたがxソケットを持っていれば、そこから読み取るxスレッドを作らなければなりません。

+0

ありがとうございます。大丈夫ですか?しかし、我々はいくつのソケットが表示されるのか分からない? – pmad

+0

これは事前に知る必要はありません。ソケットを開くたびに、そこから読み取るスレッドも作成されます。 –

+0

うん..私は2つのソケットのためにやった。しかし、私は多くのソケットのためにそれをしたい – pmad

関連する問題