Compiler findet Methode nicht

noxum

Mitglied
Guten Morgen liebes Forum,

ich bin gerade dabei für die Schule ein kleinen Eco-Server zu programmieren und bin schon über ein Problem gestolpert.

Und zwar soll der Client über eine grafische Oberfläche, welche ich mit dem Java-Editor erstellt habe, auf einen beliebigen Server connecten können. Das verbinden habe ich schonmal hinbekommen doch nun hängt es, da man bei der grafischen Oberfläche ja nicht direkt über die Konsole etwas an den Server senden kann, wie es beispielsweise bei telnet geht, habe ich mich etwas in der Documentation von Java umgesehen und die zwei Methoden getOutputStream() und getInputStream() gefunden. Also habe ich nochmal mit der Hilfe von Google geguckt ob diese Methoden auch dafür gedacht sind und darauf direkt getestet.
Doch immer wenn ich
Code:
OutputStream out;
out = socket.getOutputStream();
sagt er mir, dass er diese Methode nicht finden kann. Obwohl ich oben folgendes eingebunden habe:

Code:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

Weiß einer wieso er die Methode nicht kennt? Bin für jede Antwort dankbar, nach ewigen suchen im Internet hab ich langsam keine Ahnung mehr.

(Wenn der ganze Code benötigt wird kann ich diesen auch noch reinstellen)
Achja
Code:
socket.isConnected();
Findet er übrigens auch nicht, obwohl diese Methode in der Documentation unter Socket steht und ich wie oben beschrieben ja die ganze java.net.*; Bibliothek eingebunden habe.

MFG Noxum
(Tschuldigung dafür das es so viel Text zu so später Stunde ist :p)
 
Hi

wird überhaupt irgendeine Methode in socket nicht als Fehler gemeldet?

Zeigst du mal die Erstellung der Variable?
 
Guten Morgen und danke für deine schnelle Antwort.

Ja Methoden wie
Code:
socket.connect();

werden nicht als fehler angezeigt und auf den Server komme ich ja auch.
Die Erstellung sieht so aus:

Code:
private Socket s = null;
Erstmal habe ich sie am Anfang des Programms initialisiert.

Code:
s = new Socket(ip,port);
s.connect();
Dann habe ich ein neues Socketobjekt erstellt und es zum Server verbinden lassen.

Code:
out = s.getOutputStream();
in = s.getInputStream();
Und dann ein paar Zeilen später hab ich dann veruscht diesen Input- und OutputStream zu erstellen.

Code:
  private OutputStream out;
  private InputStream in;
in und out habe ich auch am Anfang des Programms initialisiert.


Unser Lehrer hat uns leider wenig Informationen geben, weshalb ich halt einfach ein wenig ausprobiert habe ^^
Aber hoffe mal es ist soweit alles richtig.

MFG Noxum
 
Also erstens : was soll das denn ?
Java:
Socket socket=new Socket(String, int);
socket.connect();
Ich glaube hier solltest du noch mal ganz genau in der API nachlesen ...
Wenn du einen Socket mit Host und Port erzeugst wird dieser automatisch verbunden.
Außerdem gibt es folgende Methode überhaupt nicht :
Java:
Socket.connect();
Ich glaube hier ist dann doch mal ein wenig mehr wenn nicht sogar der komplette Source nötig. Weil wenn
Java:
Socket.connect();
NICHT als FEHLER makiert wird dann arbeitest du definitiv NICHT mit java.net.Socket sondern mit irgend etwas anderem.

PS : verwende bitte der Sprache entsprechende Code-Tags *siehe Signatur*
 
Hmm... das ist komisch o_O in der Documentation ist aber unter Socket die Methode Connect und ohne Connect kommt bei meinem Server auch nichts an.


Ok aber ich schätze mal du hast da schon mehr Erfahrungen, kannst du mir dann sagen wie man sich mit einem Server verbindet ohne das über die Konsole mit Telnet zu machen?
Bis jetzt haben wir es immer mit Telnet gemacht und eigentlich war ich ganz froh, dass es jetzt auch mit Connect ging.

MFG Noxum


Edit 1: Sorry wegen den Tags, hab gedacht die normalen reichen :/
Edit 2: Also ich hab es gerade nochmal ohne die connect Methode versucht und da tut sich garnichts. :/
Edit 3: Ups garnicht gesehen das du den Code willst :p Naja hier ist er:


Java:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.lang.*;


/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 21.09.2011
  * @author
  */

public class Eco extends Frame {
  // Anfang Variablen
  private Label label1 = new Label();
  private TextField tf_ip = new TextField();
  private Label label2 = new Label();
  private TextField tf_port = new TextField();
  private TextArea ta_ausgabe = new TextArea("", 1, 1, TextArea.SCROLLBARS_VERTICAL_ONLY);
  private TextField tf_eingabe = new TextField();
  private Button verb = new Button();
  private Button bt_send = new Button();
  private OutputStream out;
  private InputStream in;
  private Socket s = null;
  // Ende Variablen

  public Eco(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { dispose(); }
    });
    int frameWidth = 333; 
    int frameHeight = 317;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2 ;
    setLocation(x, y);
    Panel cp = new Panel(null);
    add(cp);
    // Anfang Komponenten

    label1.setBounds(16, 16, 25, 24);
    label1.setText("IP:");
    label1.setFont(new Font("Dialog", Font.PLAIN, 17));
    label1.setForeground(Color.WHITE);
    cp.add(label1);
    tf_ip.setBounds(40, 16, 145, 24);
    tf_ip.setText("");
    tf_ip.setFont(new Font("Dialog", Font.PLAIN, 13));
    cp.add(tf_ip);
    label2.setBounds(208, 16, 39, 24);
    label2.setText("Port:");
    label2.setFont(new Font("Dialog", Font.PLAIN, 17));
    label2.setForeground(Color.WHITE);
    cp.add(label2);
    tf_port.setBounds(248, 16, 57, 24);
    tf_port.setText("");
    tf_port.setFont(new Font("Dialog", Font.PLAIN, 13));
    cp.add(tf_port);
    ta_ausgabe.setBounds(16, 96, 289, 129);
    ta_ausgabe.setText("");
    ta_ausgabe.setFont(new Font("Dialog", Font.PLAIN, 13));
    cp.add(ta_ausgabe);
    tf_eingabe.setBounds(16, 232, 289, 24);
    tf_eingabe.setText("");
    tf_eingabe.setFont(new Font("Dialog", Font.PLAIN, 13));
    cp.add(tf_eingabe);
    verb.setBounds(56, 48, 209, 41);
    verb.setLabel("Connect");
    verb.setFont(new Font("Dialog", Font.PLAIN, 13));
    verb.setForeground(Color.BLACK);
    verb.setCursor(new Cursor(Cursor.HAND_CURSOR));
    cp.add(verb);
    verb.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        verb_ActionPerformed(evt);
      }
    });

    bt_send.setBounds(72, 264, 169, 25);
    bt_send.setLabel("Send");
    bt_send.setFont(new Font("Dialog", Font.PLAIN, 13));
    bt_send.setCursor(new Cursor(Cursor.HAND_CURSOR));
    cp.add(bt_send);
    bt_send.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        bt_send_ActionPerformed(evt);
      }
    });

    cp.setBackground(new Color(0x404040));
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Ereignisprozeduren
  public void verb_ActionPerformed(ActionEvent evt) {
    try
    {
//-----------------------------------------------------------------------> Hier ist ein Fehler ? ;D -->
       String ip = tf_ip.getText(); 
       int port = Integer.parseInt(tf_port.getText());
       ta_ausgabe.setText("IP:"+ip+"\nPort:"+port);
       s = new Socket(ip,port);
       s.connect();
       //out = s.getOutputStream();
       //in = s.getInputStream;
       




    }
    catch(Exception e)
    {

    }

    
  }

  public void bt_send_ActionPerformed(ActionEvent evt) {

  }

  // Ende Ereignisprozeduren

  public static void main(String[] args) {
    new Eco("Eco");
  }
}

Hoffe es ist gut lesbar, achja hier ist auch nochmal der kleine EcoServer mit welchem ich gerade teste ob eine Verbindung besteht.
Java:
public class EchoServer
{
  public static void main (String args[])
  {
    try
    {
      ServerSocket server = new ServerSocket(10000);
      String text;
      boolean ende = false;
      boolean serverZu = false;
      do
      {
        Socket socket = server.accept();
        do
        {
          System.out.println("Neuer User");
          text = socket.readLine();
          socket.write(text+"\n\r");
          if (text.equals("quit"))
          ende = true;
          if (text.equals("close"))
          {
            ende = true;
            serverZu = true;
          }
        }
        while(!ende);
      socket.close();
      }
      while (!serverZu);
      server.close();
    }
    catch (Exception e)
    {

    }
  }
}

Also sobald ein das Socket ein accept() bekommt gibt er in der Konsole "Neuer User" aus, und das macht er mit connect o_O


Edit 22453: Hier ist auch nochmal ein Link zu einem Bild wie das ding überhaupt aussieht:Drück mich !
 
Zuletzt bearbeitet:
Ich kann dir jetzt nicht so helfen, wie das die anderen können, aber ich kann dir sagen, dass du ganz sicher nicht die
Java:
Socket.connect()
verwenden kannst, da es im java.net.Socket-package keine statische Methode gibt!
Es gibt Methoden, die connect heißen, aber diese erwarten mindestens einen Parameter!
Erste Methode:
Java:
public void connect(SocketAddress endpoint) throws IOException

Zweite Methode:
Java:
public void connect(SocketAddress endpoint, int timeout) throws IOException

Somit liegt dein Fehler dann wohl dort.
Socket-API
 
Hm stimmt hast recht, hab garnicht gesehen das die Parameter erwarten. Aber komisch das trozdem eine Verbindung zum Server hergestelt wird. Würde mich ja mal interessieren was da passiert.

OH! ich glaub ich hab den Fehler gefunden >.< Unser Lehrer meinte mal, dass er die Klasse Socket etwas umgeschrieben hat :/ und jetzt sehe ich, dass in der Klasse eine Connect Methode ist welche keine Parameter erwartet und einen boolischen Wert zurück gibt.

Na super, das heißt wenn er die Klasse umgeschrieben hat kann ich die standart Methoden garnicht verwenden :/


MFG Noxum


Edit :Naja trozdem vielen Dank an alle für die Mühe... dann schlag ich mich mal weiter :/ mal sehen wie weit ich komme^^
 
Zuletzt bearbeitet:
... da es im java.net.Socket-package keine statische Methode gib!

Ähm WAS ?

Erstens : java.net.Socket ist eine KLASSE ! Und kein Package ...
Zweitens : wie kommst du auf ein STATIC ? Etwa weil ich geschrieben habe
Java:
Socket.connect();
? Wenn du seinen Code mal genau lesen würdes dann würdest du sehen das er mit einem Socket-Objekt arbeitet ... das heißt er verwendet gar keine STATIC ...

Java:
import java.lang.*;

WAS ZUR HÖLLE ? Das ist nicht dein ernst das du java.lang importierst oder ? java.lang ist das Basis-Package von Java in dem Klassen wie Object und Class enthalten sind. Da dieses Package die Grundlage von allem anderen ist ist es sowieso immer "importiert" ... das kann also raus.

Edit 22453: Hier ist auch nochmal ein Link zu einem Bild wie das ding überhaupt aussieht: http://img69.imageshack.us/img69/2937/ecoy.png

Du weist aber schon das wir hier eine Anhangs-Funktion haben oder ? Verwende diese bitte auch ! Das Problem bei Fremdhostern ist das dort die Bilder irgendwann gelöscht werden und man später auf diese keinen Zugriff mehr hat. Lade also Screenshots und Codes immer über die Anhangsfunktion HIER hoch.

OH! ich glaub ich hab den Fehler gefunden >.< Unser Lehrer meinte mal, dass er die Klasse Socket etwas umgeschrieben hat :/ und jetzt sehe ich, dass in der Klasse eine Connect Methode ist welche keine Parameter erwartet und einen boolischen Wert zurück gibt.

Lege deinem Lehrer bitte FOLGENDES ans Herz :
Wenn er meint irgendwelche Klassen "umzuschreiben" das er diese
1) in einem komplett neuem Package unterbringt
2) diesen "neuen" Klassen auch neue Namen wie z.B. CustomSocket gibt ...
Wenn das wie bis jetzt scheinbar weiterhin NICHT macht wir es immer wieder zu solchen kleinen Problemen kommen ... und irgendwann in einem größeren Projekt dann mal richtig krachen ...
Das Problem für dich : wenn du uns Code mit diesen Custom-Klassen postest und wir das nicht wissen werden wir dich immer fälchlicherweise auf die API verweisen und deine vermeindlichen Fehler bemängeln die so in deiner Entwicklungsumgebung allerdings funktionieren.
Außerdem sollte der Compiler schon einen haufen Fehler werfen wenn man zwei Klasse mit selben Namen hat. Außer natürlich jemand ist so clever und gibt diesen auch noch die selben Packages ... dann hat man nur noch ein großes Chaos.

btw : es heißt immer noch Echo ... mit H ... auch im Englischen ...

Der Fehler lag also hier weniger bei dir als bei deinem Lehrer ... und daran das du ihm vertraut und mit diesem Mist den er da zusammengezimmert hat gearbeitet hast. Ich würde dir empfehlen diesen ganzen Custom-Mist zu entfernen und NUR mit der Standard-API zu arbeiten. Das wird es für dich später einfacher machen ...

Und noch mal zur Arbeitsweise von java.net.Socket :
Wenn du ein neues Socket-Objekt erzeugst ... und dem Konstruktor das Ziel mitgibst wird der Socket automatisch connected ...
Um jetzt mit den connect()-Methoden zu arbeiten erstellst du einen "leeren" Socket und gibst das Ziel über eine der beiden connect()-Methoden an ...
Aber einem Socket im Konstruktor das Ziel mitgeben und dann mit einer NICHT vorhandenen Methode connecten wollen ... das funktioniert so nicht ... zumindest nicht wenn man mit der Standard-API arbeitet.
 

Anhänge

  • ecoy.png
    ecoy.png
    150,6 KB · Aufrufe: 12
Danke für deine Informationen, ja das mit dem Echo weiß ich ja eigentlich habe mich nur mal verlesen und dachte die ganze Zeit mein Lehrer hatte ihn mal Eco genannt.
Naja hab mich jetzt mal ein wenig in der Klasse von meinem Lehrer umgeschaut und klappt jetzt auch fast alles. Ich glaube er wollte es mit der neuen Klasse für die Schüler einfacher machen, hat aber wohl nicht überdacht das man sehr verwirrt sein kann wenn in der API etwas völlig anderes steht.

Naja danke für alles :)
MFG Noxum
 

Neue Beiträge

Zurück