Как общаться несколько сокетов в Java? - PullRequest
0 голосов
/ 05 января 2011

У меня есть количество сокетов, подключенных к разным системам с разными ip-адресами с разными номерами портов.У меня вопрос: мне нужно запустить одну программу в любой системе для одновременной передачи всех сокетов, и как я могу получать сообщения из сокетов параллельно?

Пока я использую один сокет, он будет работать нормально, и я постоянно получаю сообщения от гипертерминала.более чем один подключен, тогда я получаю ответ только от первого ... поэтому, пожалуйста, предоставьте решение как можно скорее


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 сокетов, то как я могу это сделать?Я не могу создать сотни потоков ... так что предоставьте лучшее решение ..


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).

Ответы [ 3 ]

2 голосов
/ 05 января 2011

Возможно, вы захотите написать класс связи, который реализует 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 голосов
/ 05 января 2011

Вам нужно читать из каждого сокета в отдельном потоке, иначе ваше приложение будет блокировать прослушивание на одном из сокетов, даже если есть данные для чтения на других.Поэтому, если у вас есть x сокетов, вы должны создать x потоков, которые будут читать из них.

0 голосов
/ 05 января 2011

Jboss Netty - неплохой выбор для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...