【问题标题】:Make UDPServer send to UDPClient使 UDPServer 发送到 UDPClient
【发布时间】:2017-11-13 00:47:37
【问题描述】:

我正在尝试向客户端发送数据,但我还没有弄清楚 这是我的代码。

UDP 客户端:

BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

DatagramSocket datagramSocket = new DatagramSocket( );
InetAddress ipServer = InetAddress.getByName("localhost");

byte[] sendDatagram = new byte[1054];
byte[] sendDatagramB = new byte[1055];
byte[] sendDatagramC = new byte[1056];

byte[] receiveDatagram = new byte[1054];
byte[] receiveDatagramB = new byte[1055];
byte[] receiveDatagramC = new byte[1056];
while  (true) {
    System.out.println("Ingrese X");
    String msgA = input.readLine();
    System.out.println("Ingrese B");
    String msgB = input.readLine();
    System.out.println("Ingrese C");
    String msgC = input.readLine();


    sendDatagram = (msgA.getBytes());
    DatagramPacket sendPacket = new DatagramPacket(sendDatagram, sendDatagram.length, ipServer, 6667);
    datagramSocket.send(sendPacket);

    sendDatagramB = (msgB.getBytes());
    DatagramPacket sendPacketB = new DatagramPacket(sendDatagramB, sendDatagramB.length, ipServer, 6667);
    datagramSocket.send(sendPacketB);

    sendDatagramC = (msgC.getBytes());
    DatagramPacket sendPacketC = new DatagramPacket(sendDatagramC, sendDatagramC.length, ipServer, 6667);
    datagramSocket.send(sendPacketC);
}

UDP-服务器:

BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

DatagramSocket datagramSockets = new DatagramSocket( );
InetAddress ipServer = InetAddress.getByName("localhost");

byte[] sendDatagrams = new byte[1054];
byte[] receiveDatagrams = new byte[1054];

DatagramSocket datagramSocket = new DatagramSocket(6667);
byte[] sendDatagram = new byte[1054];
byte[] receiveDatagram = new byte[1054];

byte[] sendDatagramB = new byte[1055];
byte[] receiveDatagramB = new byte[1055];

byte[] sendDatagramC = new byte[1056];
byte[] receiveDatagramC = new byte[1056];

System.out.println("Server Start");

while (true){

    DatagramPacket receivePacket = new DatagramPacket(receiveDatagram,receiveDatagram.length);
    datagramSocket.receive(receivePacket);
    String receive = new String(receivePacket.getData());
    System.out.println(receive+"x");

    InetAddress ipClient = receivePacket.getAddress();
    int portClient = receivePacket.getPort();
    receiveDatagram = new byte[1054];
    String msgClient = "Hola Mundo";

    DatagramPacket receivePacketB = new DatagramPacket(receiveDatagramB,receiveDatagramB.length);
    datagramSocket.receive(receivePacketB);
    String receiveB = new String(receivePacketB.getData());
    System.out.println(receiveB+"y");

    InetAddress ipClientB = receivePacketB.getAddress();
    int portClientB = receivePacketB.getPort();
    receiveDatagramB = new byte[1055];
    String msgClientB = "Hola Mundo";

    DatagramPacket receivePacketC = new DatagramPacket(receiveDatagramC,receiveDatagramB.length);
    datagramSocket.receive(receivePacketC);
    String receiveC = new String(receivePacketC.getData());
    System.out.println(receiveC+"z");

    InetAddress ipClientC = receivePacketC.getAddress();
    int portClientC = receivePacketC.getPort();
    receiveDatagramC = new byte[1056];
    String msgClientC = "Hola Mundo";



    Double x1 =  (-portClientB - (Math.sqrt((portClient*portClientB - ((4*portClient*portClientC))))))/ (2 * portClientC);
    Double x2 =  (-portClientB + (Math.sqrt((portClient*portClientB - ((4*portClient*portClientC))))))/ (2 * portClientC);

    String xa = String.valueOf(x1);
    String xb = String.valueOf(x2);
    System.out.println("El Resultado de x1 es = "+" "+x1);
    System.out.println("El Resultado de x1 es = "+" "+x2);
}

我想将字符串XAXB 发送给客户端。

【问题讨论】:

  • 为什么不用mina.apache.orgnetty.io 来代替?
  • 它到底在做什么或不做什么?
  • @roelofs 除了我需要找出或知道如何将这两个字符串发送给客户端之外,它正在做所有事情。
  • 您能否将这些详细信息以及有关您的整体设置的更多信息添加到您的问题中?仅通过查看代码很难推断您的问题是什么......
  • UDP 没有客户端或服务器。 UDP 是一种具有发送者和接收者的无连接协议。客户端/服务器概念是应用层概念,而不是传输层概念。

标签: java networking udpclient


【解决方案1】:

我不知道您对 udp 套接字的真正用途,但通常服务器必须支持所有请求,包括来自客户端的协议。

这是我的 udp 套接字服务器从您的源代码中的样子,如下所示:

package justtest;

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

public class UDPServer {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket(6667);
        byte[] sendDatagram = new byte[1054];
        byte[] receiveDatagram = new byte[1054];

        System.out.println("Server Start");
        try
        {
            while (true) 
            {


                DatagramPacket receivePacket = new DatagramPacket(receiveDatagram, receiveDatagram.length);
                datagramSocket.receive(receivePacket);
                //System.out.println("len" + receivePacket.getLength());
                String receive = new String(receivePacket.getData());
                System.out.println(receive.trim() + " received...");

                //////// Do it what you want here //////////
                //////// done //////////////////////////////


                InetAddress IPAddress = receivePacket.getAddress();
                int port = receivePacket.getPort();

                String msgClient = "Hola Mundo";

                System.arraycopy(msgClient.getBytes(), 0, sendDatagram, 0, msgClient.getBytes().length);
                DatagramPacket sendPacket = new DatagramPacket(sendDatagram, sendDatagram.length, IPAddress, port);
                datagramSocket.send(sendPacket);

            }
        }
        finally
        {
            datagramSocket.close();
        }
    }
}

然后,udp 客户端就可以做你应该做的事情了。

package justtest;

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

public class UDPClient {
    public static void main(String[] args) throws IOException {
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        InetAddress ipServer = InetAddress.getByName("localhost");
        DatagramSocket datagramSocket = null;
        DatagramSocket datagramSocketA = null;
        DatagramSocket datagramSocketB = null;
        byte[] sendDatagram = new byte[1054];
        byte[] sendDatagramB = new byte[1055];
        byte[] sendDatagramC = new byte[1056];

        byte[] receiveDatagram = new byte[1054];
        byte[] receiveDatagramB = new byte[1055];
        byte[] receiveDatagramC = new byte[1056];

        while (true) 
        {
            System.out.println();
            System.out.println("Ingrese X");
            String msgA = input.readLine();

            //sendDatagram = (msgA.getBytes());
            System.arraycopy(msgA.getBytes(), 0, sendDatagram, 0, msgA.getBytes().length);
            DatagramPacket sendPacket = new DatagramPacket(sendDatagram, sendDatagram.length, ipServer, 6667);
            DatagramPacket recvPacket = new DatagramPacket(sendDatagram, receiveDatagram.length, ipServer, 6667);

            datagramSocket = new DatagramSocket();
            datagramSocket.send(sendPacket);
            datagramSocket.receive(recvPacket);
            System.out.printf("Send...[%s]/ recv...[%s]", new String(sendDatagram).trim(), new String(recvPacket.getData()).trim());


            System.out.println();
            System.out.println("Ingrese B");
            String msgB = input.readLine();
            //sendDatagramB = (msgB.getBytes());
            System.arraycopy(msgB.getBytes(), 0, sendDatagramB, 0, msgB.getBytes().length);
            DatagramPacket sendPacketB = new DatagramPacket(sendDatagramB, sendDatagramB.length, ipServer, 6667);
            DatagramPacket recvPacketB = new DatagramPacket(receiveDatagramB, receiveDatagramB.length, ipServer, 6667);

            datagramSocketA = new DatagramSocket();
            datagramSocketA.send(sendPacketB);
            datagramSocketA.receive(recvPacketB);
            System.out.printf("Send...[%s]/ recv...[%s]", new String(sendDatagramB).trim(), new String(recvPacketB.getData()).trim());


            System.out.println();
            System.out.println("Ingrese C");

            String msgC = input.readLine();
            //sendDatagramC = (msgC.getBytes());
            System.arraycopy(msgC.getBytes(), 0, sendDatagramC, 0, msgC.getBytes().length);
            DatagramPacket sendPacketC = new DatagramPacket(sendDatagramC, sendDatagramC.length, ipServer, 6667);
            DatagramPacket recvPacketC = new DatagramPacket(receiveDatagramC, receiveDatagramC.length, ipServer, 6667);
            datagramSocketB = new DatagramSocket();
            datagramSocketB.send(sendPacketC);
            datagramSocketB.receive(recvPacketC);
            System.out.printf("Send...[%s]/ recv...[%s]", new String(sendDatagramC).trim(), new String(recvPacketC.getData()).trim());

            datagramSocket.close();
            datagramSocketA.close();
            datagramSocketB.close();
        }
    }
}

我认为你将如何处理代码很重要。

祝你好运。

【讨论】:

  • 服务器更容易重用请求进来的DatagramSocket,只更新数据字段,只留下地址:端口。
  • 嗯,很好,但这不是我的职责,而是他。这只是基于他所做的事情的一个例子。我可以告诉你这不是一个完整的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 2018-01-27
  • 1970-01-01
相关资源
最近更新 更多