2011-01-05 14 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