Java >> Java opplæring >  >> Java

send og motta Socket Datagram

Jeg lager et server- og klientsocket-datagram.

Klienten kobler seg til serveren og du må skrive i klienten en streng som inneholder Hello eller hello.

Når serveren oppdager en streng med hello eller Hello, svarer klienten med en annen streng.

Problemet er at klienten ikke leser strengen som serveren sender.

Her er koden min.

Client
public class Client {

    public static void main(String[] args) {
        try {
            System.out.println("Creando socket datagram");
            DatagramSocket datagramSocket = new DatagramSocket();

            Scanner myObj = new Scanner(System.in);  // Create a Scanner object
            System.out.println("Say Hello");
            String saludo = myObj.nextLine();

            System.out.println("Sending message");
            InetAddress addr = InetAddress.getByName("localhost");
            DatagramPacket datagrama = new DatagramPacket(saludo.getBytes(), saludo.getBytes().length, addr, 5555);
            datagramSocket.send(datagrama);
            System.out.println("Message sent");

            System.out.println("Reading message");
            byte[] mensaje = new byte[25];
            DatagramPacket datagrama1 = new DatagramPacket(mensaje, 25);
            datagramSocket.receive(datagrama1);

            System.out.println("Message recieved: " + new String(mensaje));

            System.out.println("Closing");

            datagramSocket.close();
            System.out.println("FInished");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Server

public class Server {

    public static void main(String[] args) throws InterruptedException {
        try {

            for (;;) {
                System.out.println("Creating socket datagram");
                InetSocketAddress addr = new InetSocketAddress("localhost", 5555);
                DatagramSocket datagramSocket = new DatagramSocket(addr);

                System.out.println("RReading message");
                byte[] mensaje = new byte[25];
                DatagramPacket datagrama1 = new DatagramPacket(mensaje, 25);
                datagramSocket.receive(datagrama1);

                System.out.println("Message recieved: " + new String(mensaje));

                if (new String(mensaje).contains("hello") || new String(mensaje).contains("Hello")) {

                    String quetal = "¿Hello, how are you doing?";
                    System.out.println("Sending message");

                    TimeUnit.SECONDS.sleep(2);

                    DatagramPacket datagrama2 = new DatagramPacket(quetal.getBytes(), quetal.getBytes().length, addr.getAddress(),
                             5555);
                    datagramSocket.send(datagrama2);
                    System.out.println("Message Sent");

                }

                datagramSocket.close();

            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Jeg har prøvd å sette en dvale i serveren i tilfelle serveren sender strengen før klienten prøver å lese.

Tusen takk for hjelpen som alltid.

Svar

Dette var gøy 🙂

Husk at måten dette er kodet på, kanskje ikke er den beste, men det fungerer som du vil.

Klienten sender Hei, Serveren mottar Hei, og sender (Hei tilbake på deg).

Begge avsluttes deretter. Det fortsetter ikke å sløyfe disse 2 meldingene for alltid, men jeg viste deg ideen.

Serveren må også fungere som en klient for å kunne sende meldinger.

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

public class DReceiver{

    
    public static void replyToTheClientListening() throws IOException {
        
        DatagramSocket ds = new DatagramSocket();

        String str = "hello back at you";
        
        InetAddress ia = InetAddress.getByName("127.0.0.1");
        
        DatagramPacket dp = new DatagramPacket(str.getBytes(), str.length(), ia, 3001);
        
        ds.send(dp);
        ds.close();
    }
    
    public static void listenToMessagesFromTheClient() throws IOException {
        
        DatagramSocket ds = new DatagramSocket(3000);
        ds.setSoTimeout(60000); //Wait 60 SECONDS for messages
        
        byte[] buf = new byte[1024];
        
        DatagramPacket dp = new DatagramPacket(buf, 1024);
        ds.receive(dp);
        
        String strRecv = new String(dp.getData(), 0, dp.getLength());

        if("hello".equalsIgnoreCase(strRecv)) { //hello in any case
            
            System.out.println("Received a MSG from the Client " + strRecv);
            
            replyToTheClientListening();
        }
        ds.close();
    }
    
    public static void main(String[] args) throws Exception {
   
        listenToMessagesFromTheClient();

  }
}

DSenderen er en klient, men må også fungere som en server (for å lytte til meldinger som kommer inn fra den andre serveren)

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

public class DSender{
  
    
    public static void actAsAServerAndListenToMessages() throws IOException {
        
        //Listen to Port 3001 --The Server will send to that port
        DatagramSocket dsReceive = new DatagramSocket(3001);
        
        dsReceive.setSoTimeout(60000); //Make it wait 60 SECONDS
        
        byte[] buf = new byte[1024];
        
        DatagramPacket dpReceive = new DatagramPacket(buf, 1024);
        dsReceive.receive(dpReceive);
        
        String strRecv = new String(dpReceive.getData(), 0, dpReceive.getLength());
        
        System.out.println("Client -- Received a Msg back from Server --" + strRecv);
        
        dsReceive.close();
        
    }
    
    public static void sendAMessageAsAClientToTheServer() throws IOException {
        
        // Client will send a message to Port 3000 which the Server listens to.
        DatagramSocket ds = new DatagramSocket();
        
        String str = "hello";
        
        InetAddress ia = InetAddress.getByName("127.0.0.1");
        
        DatagramPacket dp = new DatagramPacket(str.getBytes(), str.length(), ia, 3000);
        
        ds.send(dp);
        
        ds.close();
        
    }
    public static void main(String[] args) throws Exception {

        sendAMessageAsAClientToTheServer();
    
        actAsAServerAndListenToMessages();
    
  }
}

Referanse:https://www.javatpoint.com/DatagramSocket-and-DatagramPacket

Jeg kjører serveren og deretter klienten.


Java Tag