【问题标题】:chat UDP client/server program [closed]聊天 UDP 客户端/服务器程序 [关闭]
【发布时间】:2013-03-14 09:24:01
【问题描述】:

您好,我正在尝试创建一个客户端/服务器聊天程序。 我有三个客户端和一个服务器,当客户端向服务器发送一些字符串时,服务器会将这个字符串发送给其他客户端。 我已经创建了客户端向服务器发送数据的部分,但我不知道如何将接收到的数据从客户端发送到其他客户端。

这是我创建的代码:

对于服务器:

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 是客户端的数量:client1/client2...)

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();

      }

    }

【问题讨论】:

  • 使用 UDP,您必须有一个 Server->Server 关系,因为 UDP 不是双向的。当然你可以用hole punching破解它,但是你没有说明为什么你不能使用更合适的TCP。
  • 这里没有实际问题。

标签: java client-server


【解决方案1】:

目前还不清楚您的聊天应该如何运作。 但是向前迈进的最简单的想法是:

  1. 您的服务器应保留收到的最新消息数 (X)。存储每条消息的接收时间也很好。
  2. 每次客户端连接到服务器时,服务器都会向它发送 X 条最新消息。

【讨论】:

    【解决方案2】:

    当客户端连接到服务器时,您可以将客户端地址保存在服务器中,然后,每次客户端向服务器发送新消息时,将该消息发送给其他客户端。

    您也可以使用多播。让客户端加入一个多播地址,并将新消息从服务器发送到该地址。这样您就不需要保存地址,每个客户都可以“听到”消息。

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

    【讨论】:

    • 此外,如果您使用多播,您应该知道它仅适用于您局域网上的主机。
    • @OfirAttia 这不正确。它可以在任何两台主机之间工作,前提是它们之间的所有路由器都允许它。
    猜你喜欢
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    相关资源
    最近更新 更多