簡體   English   中英

使用Java上的套接字打開兩個端口連接

[英]Open two ports connexion using sockets on java

我想使用Java上的套接字打開兩個端口的連接,但無法正常工作。 我在這里閱讀到我應該使用SocketChannel而不是套接字,但是我想使用getInput / outputStream()方法,這在Socket通道中是不可能的。 我想到了這樣的事情:

public class ServeurMaitre {
    public ServerSocket serverSocket = null;
    int poolSize = 15;
    Selector selector = null;
    private ExecutorService pool = null;
    boolean logged=false;
    ServeurMaitre(int port1, int port2, int size){
        try {
            serverSocket = new ServerSocket(port1, size);
            serverSocket = new ServerSocket(port2, size);
            pool = Executors.newFixedThreadPool(poolSize);
            System.out.println("Serveur en marche. En attente des clients");

        } catch (IOException ex) {
            Logger.getLogger(ServeurMaitre.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    void ConnexionServeur() throws IOException {
        while(true) {               
            Socket cnx = serverSocket.accept();
            if (cnx.getLocalPort()==3333) {
                pool.execute(new EsclaveXML(cnx, this));
            }
            if(cnx.getLocalPort()==8000) {
                pool.execute(new EsclaveHTTP(cnx, this));
            }           
        }   
    }
}

主要的:

public class Main{
    public static void main(String[] args) throws IOException {
        ServeurMaitre serveur = new ServeurMaitre(8000, 3333, 1);
        serveur.Initialisation();
        serveur.ConnexionServeur();

    }
}

這是兩個奴隸都在做的事情:

public class EsclaveHTTP implements Runnable{
    Socket socket = null;
    ServeurMaitre sm = null;
    public EsclaveHTTP(Socket cnx, ServeurMaitre serveurMaitre) {
        this.socket=cnx;
        this.sm=serveurMaitre;
    }

    @Override
    public void run() {
        BufferedReader in = null;
        PrintWriter out = null;
        String message_distant = "";
        try {
            in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream());
            message_distant = in.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }  
        System.out.println(message_distant); //etc etc and at the end: 


        if(!socket.isClosed())
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
}

第二個

public class EsclaveXML implements Runnable{
    Socket socket = null;
    public EsclaveXML(Socket cnx, ServeurMaitre serveurMaitre) {
        this.socket=cnx;
    }


    @Override
    public void run() {
        try {
            BufferedReader input = new BufferedReader(
                new InputStreamReader(socket.getInputStream(), "8859_1"), 1024);
            StringBuffer sb = new StringBuffer();
            InputStream ch = socket.getInputStream();
            //System.out.println(ch);
            try {
                SAXParserFactory factory = SAXParserFactory.newInstance();
                SAXParser parser = factory.newSAXParser();
                parser.parse(ch, new ParseurXML());
            }catch (DOMException e) {
                e.printStackTrace();
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (TransformerFactoryConfigurationError e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        catch(IOException e) {System.out.println(e);}
        finally {
            try { if(socket != null) socket.close();}
            catch(IOException e) {}
        }
    }
}

但是它只會接受一種聯系。

我如何進行某種並行連接?

您正在覆蓋serverSocket變量

    serverSocket = new ServerSocket(port1, size);
    serverSocket = new ServerSocket(port2, size);

因此,您只接受第二個連接。 您需要兩個變量serverSocket1和serverSocket2,並在兩者上都調用accept()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM