Avatar billede roo104 Nybegynder
31. august 2003 - 13:46 Der er 13 kommentarer og
1 løsning

Sende UDP pakke og modtage svar

Jeg skal have sendt en UDP pakke til en server som så sende en pakke tilbage med en streng.
Hvordan ville man lave sådan noget, kender ikke så meget til netværk i java, ved bare at der er mange stream metoder.
Indtul nu har jeg strikket dette sammen

DatagramSocket socket = new DatagramSocket(27025);

ByteArrayOutputStream baus = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baus);
ps.print("\\xFF\\xFF\\xFF\\xFFinfo\\x00");

byte[] barray = baus.toByteArray();

DatagramPacket packet = new DatagramPacket(barray,barray.length);         

InetAddress remote_addr = InetAddress.getByName(hostname);

packet.setAddress(remote_addr);
           
packet.setPort(27025);
           
socket.send(packet);

Men er ikke sikke på den får sendt det rigtige, og jeg skal også modtage den pakke der kommer tilbage.

Nogen der kan hjælpe mig lidt vidre ?
Avatar billede x-masman Nybegynder
31. august 2003 - 16:05 #1
Skal du selv lave UDP protokollen eller hvad? Kan du ikke starte med at printe det Bytearray ud som du sender på klient siden og så printe det ud på server siden. Så kan du se om pakken er rigtig sendt.
Hvis du skal sende en streng tilbage ville det så ikke være hensigtmæssigt at bruge en mere pålidelig protokol?
Avatar billede roo104 Nybegynder
31. august 2003 - 16:25 #2
Jeg skal bare sende en pakke med dette indhold "\\xFF\\xFF\\xFF\\xFFinfo\\x00" serveren sende så en udp pakke tilbage med en anden streng "bla\nbla\n"
Jeg kan ikke se om serveren modtager serveren, kun se om den giver mig svar igen.
Det er i forbindelse med counter strike real-time serverinfo.
Avatar billede soreno Praktikant
31. august 2003 - 16:29 #3
Prøv at kigge lidt på disse udklip af noget kode:


private static byte sendInfo[] = {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff,                                      (byte)'i', (byte)'n', (byte)'f', (byte)'o',
                              (byte)0x00};


byte data[] = net.sendPacket(sendInfo);

public byte[] sendPacket(byte packet[])
{
    byte recvData[] = new byte[4096];
    try
    {
        DatagramSocket socket = new DatagramSocket();
        DatagramPacket sendPacket = new DatagramPacket(packet, packet.length, addr, port);
        socket.send(sendPacket);
       
        DatagramPacket recvPacket = new DatagramPacket(recvData, recvData.length);
        socket.receive(recvPacket);
        socket.close();           
    }
    catch(SocketException e1)
    {
        e1.printStackTrace();
    }
    catch(IOException e2)
    {
        e2.printStackTrace();
    }       
   
    return recvData;       
}
Avatar billede roo104 Nybegynder
31. august 2003 - 16:56 #4
Skal nok have lidt mere hjælp, kom frem til noget, men får ikke noget svar tilbage den hænger bare, måske der også skal noget timeout på.

package CS;
import java.net.*;
import java.io.*;

public class CSInfo {
   
    public static void main(String args[]) {
        byte data[] = sendPacket(sendInfo);
        System.out.println(data[0]);

       
    }
   
    private static byte sendInfo[] = {(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)'i',(byte)'n',(byte)'f',(byte)'o',(byte)0x00};
   
    public static byte[] sendPacket(byte packet[]) {
            byte recvData[] = new byte[4096];
            try {
                DatagramSocket socket = new DatagramSocket();
                InetAddress addr = InetAddress.getByName("137.224.240.7");
                DatagramPacket sendPacket = new DatagramPacket(new byte[4096], 4096, addr, 27025);
                socket.send(sendPacket);

                DatagramPacket recvPacket = new DatagramPacket(recvData, recvData.length);
                socket.receive(recvPacket);
                socket.close();         
            }
            catch(SocketException e1) {
                e1.printStackTrace();
            }
            catch(IOException e2) {
                e2.printStackTrace();
            }     
            return recvData;     
        }
}


Hvis jeg sætter socket.setSoTimeout(2000); skriver den

0
java.net.SocketTimeoutException: Receive timed out
        at java.net.PlainDatagramSocketImpl.receive(Native Method)
        at java.net.DatagramSocket.receive(DatagramSocket.java:711)
        at CS.CSInfo.sendPacket(CSInfo.java:26)
        at CS.CSInfo.main(CSInfo.java:8)
Avatar billede soreno Praktikant
31. august 2003 - 17:10 #5
Dette virker:

import java.io.*;
import java.net.*;

public class Main
{
        private static byte sendInfo[] = {(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)'i',(byte)'n',(byte)'f',(byte)'o',(byte)0x00};

        public static void main(String[] args)
        {
            byte data[] = sendPacket(sendInfo);
            for(int i=0;i<data.length;i++)
            {
                System.out.print((char)data[i]);
            }
        }
   
 
        public static byte[] sendPacket(byte packet[])
        {
            byte recvData[] = new byte[4096];
            try
            {
                DatagramSocket socket = new DatagramSocket();
                InetAddress addr = InetAddress.getByName("137.224.240.7");
                DatagramPacket sendPacket = new DatagramPacket(packet, packet.length, addr, 27025);
                socket.send(sendPacket);

                DatagramPacket recvPacket = new DatagramPacket(recvData, recvData.length);
                socket.receive(recvPacket);
                socket.close();       
            }
            catch(SocketException e1)
            {
                e1.printStackTrace();
            }
            catch(IOException e2)
            {
                e2.printStackTrace();
            }   
            return recvData;   
        }       
}
Avatar billede roo104 Nybegynder
31. august 2003 - 17:16 #6
Cool thx, så har jeg noget at arbejde vidre med
Avatar billede roo104 Nybegynder
31. august 2003 - 17:31 #7
btw, kan man ikke få det som en streng i stedet for et byte array ?
Avatar billede soreno Praktikant
31. august 2003 - 17:34 #8
Det vil nok være en dum ide.

Du er jo nødt til at parse data så du får noget brugbart ud af det.

Hvis du konverterer til en String går der data tabt.

En start kunne være at du kigger på dette:

(Info klassen er bare en opbevaringsklasse - det bør være nemt at se hvordan data parses.

        private static void parseInfo(byte data[], Info info)
        {
            /*
              (int32)        -1
              (byte)        ASCII 'C' (info response, S2A_INFO)
              (string)        net address of server
              (string)        name of the host / server
              (string)        name of the map
              (string)        game directory (i.e. valve/)
              (string)        Game description (e.g. "half-life multiplay")
              (byte)        active client count
              (byte)        maximum clients allowed
              (byte)        protocol version (currently 7)
            */
           
            //net address
            int x = 5;
            StringBuffer sb = new StringBuffer();
            while(data[x] != 0x00)
            {
                sb.append((char)data[x]);
                x++;
            }
            info.setHost(sb.toString());
            x++;
           
            //server name
            sb = new StringBuffer();
            while(data[x] != 0x00)
            {
                sb.append((char)data[x]);
                x++;
            }
            info.setName(sb.toString());
            x++;       
           
            //map name
            sb = new StringBuffer();
            while(data[x] != 0x00)
            {
                sb.append((char)data[x]);
                x++;
            }
            info.setMap(sb.toString());
            x++;       
           
            //game dir       
            sb = new StringBuffer();
            while(data[x] != 0x00)
            {
                sb.append((char)data[x]);
                x++;
            }
            info.setGame(sb.toString());
            x++;
           
            //game description
            sb = new StringBuffer();
            while(data[x] != 0x00)
            {
                sb.append((char)data[x]);
                x++;
            }
            info.setDescription(sb.toString());
            x++;
           
            //number of clients
            info.setNumberOfClients((int)data[x]);
            x++;
           
            //max number of clients
            info.setMaxNumberOfClients((int)data[x]);
            x++;
           
            //protocol version
            info.setProtocolVersion((int)data[x]);
        }
Avatar billede roo104 Nybegynder
31. august 2003 - 17:38 #9
Jeg får nemlig /n som jeg gerne ville splitte på så jeg fik får String array med data
Avatar billede soreno Praktikant
31. august 2003 - 17:41 #10
Hvis du vil prøve så kan du bruge denne constructor:
String(byte[] bytes)

Altså
String test(data);
Avatar billede roo104 Nybegynder
31. august 2003 - 17:42 #11
noget du selv har lavet eller fundet, et link ville være rart :)
Avatar billede soreno Praktikant
31. august 2003 - 17:46 #12
Avatar billede roo104 Nybegynder
31. august 2003 - 18:02 #13
0x00 er det \n newline ?
Avatar billede soreno Praktikant
31. august 2003 - 18:06 #14
Nej, det er NULL
\n er platform afhængig.

Se:
http://www.asciitable.com/

samt http://ccrma-www.stanford.edu/~craig/utility/flip/:

Operating System              Newline Character(s)
Microsoft Windows / MS-DOS           0Dh 0Ah
Apple Macintosh OS 9 and earlier           0Dh
Unix (e.g., Linux) and Apple OS X           0Ah
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester