簡體   English   中英

如何使客戶端服務器Java應用程序在一個端口上發送消息,而在另一個端口上接收消息?

[英]How do I make a client-server Java application to send messages on one port but receive them on another?

我當前正在嘗試制作一個應用程序,該應用程序將使用一個端口將消息發送到服務器,但是將在另一個端口上接收消息。 但是,根據我遵循的教程,似乎連接到服務器的行為是發揮作用的端口,而我的客戶端正在同一端口上接收和發送消息。 如何使它在一個端口上發送但在另一個端口上接收呢?

這是我認為與客戶端相關的代碼(我放入了一些看起來無關的東西,因為我認為它們是可以通過在一個端口上接收而在另一個端口上發送而改變的東西,而忽略了有關替換inetaddress的評論,只是我正在努力在gui中實現此功能):

public void startRunning(){
    try{
        connectToServer();
        setupStreams();
        whileChatting();

    }catch(EOFException eofException){
        showMessage("\n Client terminated connection");

    }catch(IOException ioException){
        ioException.printStackTrace();
    }finally{
        closeStuff();
    }

}



//connect to server
private void connectToServer() throws IOException{
    showMessage("Attempting connection... \n");
    connection = new Socket(InetAddress.getByName(serverIP), 480);//replace serverIP with ipTextField.getText or set serverIP to equal ipTextField.getText? Same with port number.
    showMessage("Connected to:  " + connection.getInetAddress().getHostName() );
}


//set up streams to send and receive messages
private void setupStreams() throws IOException{
    output = new ObjectOutputStream(connection.getOutputStream());
    output.flush();
    input = new ObjectInputStream(connection.getInputStream());
    showMessage("\n Streams are good!  \n");
}


//while talking with server
private void whileChatting() throws IOException{
    ableToType(true);
    do{
        try{
            message = (String) input.readObject();
            showMessage("\n" + message);
        }catch(ClassNotFoundException classNotfoundException){
            showMessage("\n Don't know that object type");
        }

    }while(!message.equals("SERVER - END"));
}

//send messages to server
private void sendMessage(String message){
    try{
        output.writeObject("CLIENT - " + message);
        output.flush();
        showMessage("\nCLIENT - " + message);
    }catch(IOException ioException){
        messageWindow.append("\n something messed up ");
    }

}


//change/update message window
private void showMessage(final String m){
    SwingUtilities.invokeLater(
        new Runnable(){
            public void run(){
                messageWindow.append(m);
            }
        }
    );

}

編輯/更新:為了幫助弄清楚一些事情,這里有一些更多信息。 發送第一條消息的設備已連接到傳感器,並且當該傳感器檢測到某些東西時,它會向另一設備發送信息。 接收設備在另一個端口上發送一條消息,告訴原始發送設備如何響應。 讓我們將這兩個設備命名為“舉報人”和“決策者-指揮官”。

如果要使用TCP / IP套接字,則不能使用aa套接字發送和使用另一個套接字讀取。 那不是他們的目的。

如果使用集中式分布式算法(服務器/客戶端通信),則必須將服務器設置為使用ServerSocket類在單個套接字端口上進行偵聽:然后服務器嘗試通過該套接字接受客戶端。

例:

ServerSocket listener = new ServerSocket(Port)
While (true) {
    new Clienthandler(listener.accept());
}

服務器將偵聽該端口,並且當客戶端嘗試連接到該端口(如果被接受)時,服務器將啟動其處理程序。 在此處理程序構造函數上,在客戶端上使用的Socket對象在參數上接收,然后可以用於獲取作者和讀者。 該處理程序類的讀者將是客戶端類的作者,反之亦然,也許正是您所要的。

您關於以這種方式使用兩個端口的問題有點奇怪。 您聲明您有一個客戶端和一個服務器,並且它們應該在不同的端口上進行通信。

只是為了闡明圖片,該服務器是一排掛有多個掛鈎的夾克的掛架。 服務器監聽的每個端口都代表一個鈎子。 當涉及到客戶端服務器關系時,客戶端或夾克知道在哪里可以找到它的鈎子,但是該鈎子是盲目的並且不知道在哪里可以找到夾克。

現在,客戶端選擇一個端口或一個掛鈎並連接到它。 連接就像一個帶有兩個管道的管道。 一個供客戶端與之一起將數據傳送到服務器,另一個供客戶端將數據從服務器發送回客戶端。 建立連接后,可以雙向傳輸數據。 這意味着我們只需要在服務器上打開一個端口即可將數據從客戶端發送到服務器,並且方向相反。

服務器上只有一個開放端口供客戶端連接的原因是,在常規客戶端計算機上很難保持開放端口進行連接。 普通的台式機用戶將位於幾個阻止傳入連接的防火牆之后。 如果不是這種情況,客戶端可能會遭到惡意病毒的毫無意義的黑客攻擊。

繼續講兩個端口的解決方案,我們不能說這是一個客戶端服務器連接。 它更像是對等連接或類似的東西。 但是,如果這是您要執行的操作,則首先要連接的應用程序必須先告訴其他應用程序要使用的IP和端口來進行連接,它可能還應該提供某種令牌,以用於進行連接。重新連接時配對新的傳入連接。

您應該注意,在大多數情況下,實現這樣的實現不是一個好主意,因為它會使客戶端和服務器應用程序之間的簡單數據傳輸變得非常復雜。

暫無
暫無

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

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