2013-03-14 97 views
2

嗨,我正在嘗試創建客戶端/服務器聊天程序。 我有三個客戶端和一個服務器,當客戶端發送一些字符串到服務器時,服務器將把這個字符串發送給其他客戶端。 我創建了客戶端向服務器發送數據的部分,但我不知道如何將接收到的數據從客戶端發送到其他客戶端。聊天UDP客戶端/服務器程序

這是我創建的代碼:

對於服務器:

import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 



public class Server { 

    private static DatagramSocket serverSocket; 

    public Server() { 
     // TODO Auto-generated constructor stub 
    } 

    /** 
    * @param args 
    * @throws IOException 
    */ 
    public static void main(String[] args) throws Exception { 

     serverSocket = new DatagramSocket(1111); 
     byte[] receiveData = new byte[1024]; 
     byte[] sendData = new byte[1024]; 
     while(true) 
      { 
       DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
       serverSocket.receive(receivePacket); 
       String s = new String(receivePacket.getData()); 
       System.out.println("Client dit : " + s); 
       InetAddress IPAddress = receivePacket.getAddress(); 
       boolean found = false; 
       int port = receivePacket.getPort(); 
       sendData = s.getBytes(); 
      } 

    } 

} 

爲客戶提供:(X是客戶端的數量:客戶端1 /客戶機程序...)

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 


    public class ClientX { 

     public ClientX() { 
     // TODO Auto-generated constructor stub 
     } 

     /** 
     * @param args 
     * @throws IOException 
     */ 
     public static void main(String[] args) throws Exception { 

     BufferedReader inFromUser = 
       new BufferedReader(new InputStreamReader(System.in)); 
       DatagramSocket clientSocket = new DatagramSocket(); 
       InetAddress IPAddress = InetAddress.getByName("localhost"); 
       System.out.println("Connécté au serveur !"); 
       byte[] sendData = new byte[1024]; 
       byte[] receiveData = new byte[1024]; 
       System.out.print("Ecrire un message: "); 
       String s = inFromUser.readLine(); 
       sendData = s.getBytes(); 
       DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 1111); 
       clientSocket.send(sendPacket); 
       DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
       clientSocket.receive(receivePacket); 
       String message = new String(receivePacket.getData()); 
       System.out.println(message); 
       clientSocket.close(); 

     } 

    } 
+0

使用UDP,你必須有一個服務器 - >服務器的關係,因爲UDP不是雙向的。當然你可以用[hole punching](http://en.wikipedia.org/wiki/UDP_hole_punching)來破解它,但是你沒有指定爲什麼你不能使用更合適的TCP。 – tjameson 2013-03-15 18:26:37

+0

這裏沒有實際的問題。 – EJP 2016-09-11 23:02:28

回答

0

您的聊天應該如何工作有點不清楚。 但前進的最簡單的想法是:

  1. 您的服務器應該保留收到的消息的最新數量(X)。存儲收到每封郵件的時間也不錯。
  2. 每次客戶端連接到服務器時,服務器都會向其發送X最新消息。
0

當客戶端連接到服務器時,可以將客戶端地址保存在服務器中,然後每次客戶端向服務器發送新消息時,都會將該消息發送給其他客戶端。

你也可以使用多播。使客戶端加入多播地址,並將新消息從服務器發送到該地址。這樣你就不需要保存地址,每個客戶都可以「收聽」信息。

http://docs.oracle.com/javase/1.4.2/docs/api/java/net/MulticastSocket.htmlhttp://staff.www.ltu.se/~peppar/java/multicast_example/

+1

另外,如果您使用多播,您應該知道它僅適用於您局域網上的主機。 – 2015-03-16 07:48:07

+0

@OfirAttia這是不正確的。它適用於任何兩臺主機之間,只要所有路由器都在允許之間。 – EJP 2016-09-11 23:01:56