Avatar billede kelmof Nybegynder
09. november 2004 - 10:50 Der er 19 kommentarer og
1 løsning

Sende byte array afsted via tcpip klasse

Jeg har et problem med at sende et byte array afsted via min tcpip klasse. I funktionen opretter jeg først et byte array (sende), hvorefter jeg definere værdierne i arrayet.
Når så jeg vil sende arrayet afsted via. gtp.send((byte)sende); skriver den at den forventer en byte og ikke et byte array.
Og det selvom der i tcpip klassen, hvor send er defineret kan sendes som et byte array.

Håber der er nogle som ved hvad jeg gør galt.

>>>>>>>Funktion start<<<<<<<<<

void update_name(){
      int i;
      byte[] in;
      byte[] sende = new byte[4];
      boolean get = false;
      sende[0] = (byte)00;
      sende[1] = (byte)01;
      sende[2] = (byte)00;
      sende[3] = (byte)248;

      String name = new String("");
      /*
      gtp.send_escape();
      in = gtp.receive();
      gtp.send_escape();
      gtp.send_enter();
      */
      try {
        Thread.currentThread().sleep(200);
      }
      catch (InterruptedException e) { }
      for (i=1;i <=4 ;i++){
        gtp.send((byte) sende);
      }

      gtp.send_enter();
      try {
        Thread.currentThread().sleep(600);
      }
      catch (InterruptedException e) { }

      in = gtp.receive();
      for (i=1;i<=in.length;i++){
        if (in[i] == 0x0D && in[i-1] == 0x43){
          get = true;
          i++;
        }
        if (get == true){
          name += (char)in[i];

        }
        if (get == true && in[i] == 0x0D){
                get = false;
                i = in.length+1;
        }
      }
    //System.out.println(send);
    }
>>>>>Funktion slut<<<<<<<<<<<

>>>>>Klasse start<<<<<<<<<<<<

package admin;

import java.*;
import java.lang.*;
import java.net.*;
import java.util.*;
import java.io.*;

/*
* This class opens a TCP connection, and allows reading and writing of byte arrays.
*/

public class tcpip
{
  protected Socket s = null;
  public DataInputStream dis = null;
  protected DataOutputStream dos = null;

  public tcpip(InetAddress ipa, int port)
        {
          Socket s1 = null;
          try {                 // Open the socket
            s1 = new Socket(ipa.getHostAddress(), port);
          }
          catch (IOException e) {
            System.out.println("Error opening socket");
            return;
          }
          s = s1;
          try {                // Create an input stream
            dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));
          }
          catch(Exception ex) {
            System.out.println("Error creating input stream");
          }
          try    {                // Create an output stream
            dos = new DataOutputStream(new BufferedOutputStream(s.getOutputStream()));
          }
          catch(Exception ex) {
            System.out.println("Error creating output stream");
          }
        }

        public synchronized void disconnect()
        {
          if (s != null) {
            try {
              s.close();
            }
            catch (IOException e){}
          }
        }

        public synchronized void send_escape()
        {
          try {
            byte[] b = new byte[1];
            b[0] = (byte)27;
            dos.write(b, 0, 1);
            dos.flush();
          }
          catch (Exception ex) {
            System.out.println("Error sending data : " + ex.toString());
          }
        }

        public synchronized void send_enter()
        {
          try {
            byte[] b = new byte[1];
            b[0] = (byte)13;
            dos.write(b, 0, 1);
            dos.flush();
          }
          catch (Exception ex) {
            System.out.println("Error sending data : " + ex.toString());
          }
        }

        public synchronized void send(byte[] temp)
        {
          try {
            dos.write(temp, 0, temp.length);
            dos.flush();
          }
          catch(Exception ex) {
            System.out.println("Error sending data : " + ex.toString());
          }
        }

        public synchronized void send(byte[] temp, int len)
        {
          try {
            dos.write(temp, 0, len);
            dos.flush();
          }
          catch(Exception ex) {
            System.out.println("Error sending data : " + ex.toString());
          }
        }

        public synchronized void send(String given)
        {
          // WARNING: this routine may not properly convert Strings to bytes
          int length = given.length();
          byte[] retvalue = new byte[length];
          char[] c = new char[length];
          given.getChars(0, length, c, 0);
          for (int i = 0; i < length; i++) {
            retvalue[i] = (byte)c[i];
          }
          send(retvalue);
        }

        public synchronized byte[] receive()
        {
          byte[] retval = new byte[0];

          try {
            while(dis.available() == 0);  /* Wait for data */
          }
          catch (IOException e){}
          try {
            retval = new byte[dis.available()];
          }
          catch (IOException e){}
          try {
            dis.read(retval);
          }
          catch (IOException e){}
          return(retval);
        }

        public int available()
        {
          int avail;

          avail = 0;
          try {
            avail = dis.available();
          }
          catch (IOException e) {}

          return(avail);
        }
      }
>>>>>>>>>>Klasse slut<<<<<<<<<<<<
Avatar billede kalp Novice
09. november 2004 - 11:13 #1
modtager skal også være en byttearray... det er en byte?
Avatar billede kalp Novice
09. november 2004 - 11:18 #2
gtp.send((byte[i]) sende);


??
Avatar billede kelmof Nybegynder
09. november 2004 - 11:28 #3
det virker heller ikke - men hvis jeg skriver gtp.send((byte[])sende); melder den ikke fejl i koden, men kommer med en fejl, når jeg compiler det.
Den skriver at der er en nullpointer exception i netop denne linje kode:
gtp.send((byte[])sende);
Avatar billede kalp Novice
09. november 2004 - 11:57 #4
det betyder at hvert element af arrayet har en null reference!

de referere ikke til noget
Avatar billede kalp Novice
09. november 2004 - 12:04 #5
du skal  initialisere hvert element i arrayet...

men kan også være jeg er helt galt på den så vil lade andre komme til nu før jeg leder dig på vildspor:)
Avatar billede arne_v Ekspert
09. november 2004 - 12:37 #6
Du kan hente bytes i en String med:

byte[] b = s.getBytes();

eller

byte[] b = s.getBytes("ISO-8859-1");
Avatar billede arne_v Ekspert
09. november 2004 - 12:38 #7
med hensyn til:

gtp.send((byte) sende);


kan du ikke case et byte array til en byte, men du kan vel bare bruge:

gtp.send(sende);

da der er en send som tager byte[]
Avatar billede arne_v Ekspert
09. november 2004 - 12:38 #8
byte er en simple type og kan derfor ikke være null.

En uinitialiseret byte er 0.
Avatar billede kelmof Nybegynder
09. november 2004 - 13:02 #9
jeg har prøvet med:

gtp.send(sende);

men det giver præcist samme fejl.

Jeg har ændret de 4 variable i mit sende array til at have en anden værdi end 0, men det giver stadig den samme fejl i linjen:

gtp.send(sende);

Den kommer også med meddelelsen:

"Exception in thread "main" java.lang.NoClassDefFoundError: admin/Adminwindow
Avatar billede kalp Novice
09. november 2004 - 13:06 #10
Avatar billede kelmof Nybegynder
09. november 2004 - 13:25 #11
den sidste fejl med:
"Exception in thread "main" java.lang.NoClassDefFoundError: admin/Adminwindow

var min egen fejl - var i det forkerte bibliotek - DUMT.

Men Null pointer fejlen er stadig den samme.

Har nu prøvet både med

gtp.send((byte[] sende);

og gtp.send(sende);

og lige meget hjælper det.
Avatar billede arne_v Ekspert
09. november 2004 - 13:25 #12
"Exception in thread "main" java.lang.NoClassDefFoundError: admin/Adminwindow

antyder at du forsøger at køre dit program med:

java admin/AdminWindows

fremfor det rigtige:

java -classpath admin AdminWindow
Avatar billede arne_v Ekspert
09. november 2004 - 13:27 #13
Får du fejl ved compilering eller ved kørsel ?

Og kan du poste den præcise fejl og de linier hvor fejlen sker ?
Avatar billede kelmof Nybegynder
09. november 2004 - 13:42 #14
Fejlen sker i det følgende:

java.lang.NullPointerException
    at admin.Adminwindow.update_name(Adminwindow.java:177)
    at admin.Adminwindow.jbInit(Adminwindow.java:142)
    at admin.Adminwindow.init(Adminwindow.java:58)
    at com.borland.jbuilder.runtime.applet.AppletTestbed.startApplet(Unknown Source)
    at com.borland.jbuilder.runtime.applet.AppletTestbed.main(Unknown Source)

Linje 177 er følgende:

gtp.send( sende);

Det må være min instans gtp af klassen tcpip som der er noget galt med.

Fejlen kommer både når jeg compiler og ved kørsel.

Dette er min funktion hvor fejlen tilsyneladende sker:

void update_name(){
      int i;
      byte[] in;
      byte[] sende = new byte[4];
      boolean get = false;
      sende[0] = (byte)0x01;
      sende[1] = (byte)0x01;
      sende[2] = (byte)0x01;
      sende[3] = (byte)0xF8;
   
     
         
      String name = new String("");
      /*gtp.send_escape();
      in = gtp.receive();
      gtp.send_escape();
      gtp.send_enter();*/
      try {
        Thread.currentThread().sleep(200);
      }
      catch (InterruptedException e) { }
      //for (i=0;i <=3 ;i++){
        gtp.send( sende);
      //}
     
      gtp.send_enter();
      try {
        Thread.currentThread().sleep(600);
      }
      catch (InterruptedException e) { }
 
      in = gtp.receive();
      for (i=1;i<=in.length;i++){
        if (in[i] == 0x0D){
          get = true;
          i++;
        }
        if (get == true){
          name += (char)in[i];
 
        }
        if (get == true && in[i] == 0x0D){
                get = false;
                i = in.length+1;
        }
      }
    //System.out.println(send);
    }
Avatar billede kelmof Nybegynder
09. november 2004 - 13:45 #15
har lige sat det op til 80 point, da det er temlig vigtigt for mig at få det til at virke :)
Avatar billede arne_v Ekspert
09. november 2004 - 13:52 #16
Har du en:

tcpip gtp = new tcpip();

?

Bare en:

tcpip gtp;

skal jo give en null pointer exception når gtp bruges.
Avatar billede kelmof Nybegynder
09. november 2004 - 14:01 #17
i min:

public class Adminwindow extends Applet {
public tcpip gtp = null;

og i min jbInit har sætter jeg:

gtp = null;

har lige prøvet med begge de to som du skrev, men stadig samme fejl.
Avatar billede arne_v Ekspert
09. november 2004 - 14:04 #18
Hvis du i jbInit erstatter:

gtp = null;

med:

gtp = new tcpip();

så burde den null pointer exception forsvinde.
Avatar billede kelmof Nybegynder
09. november 2004 - 14:11 #19
det var det!

Manglede godt nok også en constructor til tcpip, men du hjalp mig da det rigtige sted hen, så kom med et svar og du får point
Avatar billede arne_v Ekspert
09. november 2004 - 14:14 #20
ok
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