2014-01-07 235 views
0

我希望能夠通過網絡發送簡單的消息。任何消息。如何通過網絡發送消息?

具體來說,我想要一臺運行時間一直很長的服務器,以及一臺可以連接到服務器並按需與服務器通信的客戶端。

我不知道從哪裏開始。通過網絡發送消息的最簡單方法是什麼?

+2

歡迎來到StackOverflow http://stackoverflow.com/questions/how-to-ask – gtgaxiola

+1

我投了這個問題,這裏是爲什麼:這實際上是一個非常明確和謹慎的問題。他要求一個非常簡單的事情,「我如何通過網絡發送消息」可能有很多方法可以做到這一點,但這很好,只要以單一方式回答就可以解決問題。 –

+0

服務器應該是多線程的,不一定要但可能更容易,並且應該始終監聽新的連接。當它收到一個新的連接時,將它放到一個新的線程中,去做它的業務,然後再聽另一個連接。在那裏尋找教程,你會發現它。通過練習和嘗試新技術,你會發現哪些是有效的,哪些沒有。我上面列出的選項僅僅是解決您的項目的衆多解決方案之一。祝你好運:) –

回答

2

本教程Reading from and Writing to a Socket開始,你可以用它採用了ServerSocket像這樣

public static void main(String[] args) throws Exception { 
    // create socket 
    int port = 4444; 
    ServerSocket serverSocket = new ServerSocket(port); 
    System.err.println("Started server on port " + port); 

    // repeatedly wait for connections, and process 
    while (true) { 
    // a "blocking" call which waits until a connection is requested 
    Socket clientSocket = serverSocket.accept(); 
    System.err.println("Accepted connection from client"); 

    // open up IO streams 
    BufferedReader in = new BufferedReader(new InputStreamReader(
      clientSocket.getInputStream())); 
    PrintWriter out = new PrintWriter(clientSocket.getOutputStream()); 
    // waits for data and reads it in until connection dies 
    // readLine() blocks until the server receives a new line from 
    // client 
    String s; 
    try { 
     while ((s = in.readLine()) != null) { 
      out.println(s); 
      out.flush(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    // close IO streams, then socket 
    System.err.println("Closing connection with client"); 
    out.close(); 
    in.close(); 
    clientSocket.close(); 
} 

然後你可以使用「遠程登錄本地主機4444」,以測試它,或者寫一個完整的客戶端簡單echo server啓動;也許就像上面教程中的客戶端一樣。

+0

現在我該如何讓客戶接洽? XD – user3170707

+0

@ user3170707 [Here](http://docs.oracle.com/javase/tutorial/networking/sockets/examples/EchoClient.java)。 –

2

好的,這個問題真的很開放。首先有幾個問題需要回答:您是要實現自己的服務器還是使用現有的技術。 JMS-API顯然將成爲後一種情況的起點。有很多實現提供者,Glassfish本身的參考實現,HornetQ獨立或作爲JBoss實例的一部分,僅舉兩個例子。使用JMS發送消息在理解一些基本概念時非常簡單,它們可以同時包含文本和二進制數據。 使用現有解決方案的另一種方法是實現您的客戶端可以連接到的WebService,這將是基於REST的Web服務的JAX-RS。這種方法也是更獨立於平臺的,在撰寫本文時,我不知道支持JMS的Android客戶端的庫,並且大多數其他編程語言都完全支持基於REST的服務。但是,如果您不想使用任何現有的protocoll,則必須堅持自己的服務器和客戶端實現。所以這將是所提到的套接字編程。好吧,這個任務並不容易:你的服務器不會同時處理多個客戶端,在另一個請求完成之前不會阻止一個請求,而是提供一些機制來授權客戶端訪問服務器的應用程序。當您同時處理多個客戶端時,您將可以共享您的客戶端之間共享的資源,以便對這些資源的訪問必須同步,這些主題與併發編程相關,並且是其自己的一個安靜的有趣的信息技術領域。您的應用程序設計的其他相互影響的方面可能是使用支持JNDI進行資源綁定或實施CDI容器的決策,以便客戶可以輕鬆地調整您的消息交換格式。這很有趣,但不是一天內的任務。 ;)