Avatar billede mora Nybegynder
26. februar 2003 - 19:25 Der er 10 kommentarer og
1 løsning

Tunnel

Jeg skal ha lavet et java program der kan tage imod x forbindelser og sende dem videre til den samme server (naturligvis med deres egen forbindelse).

Jeg har lavet en klasse, der laver et objekt multiserver der laver en workerthread for hver klient der forbinder til vores server side, workerthread laver så et client objekt der forbinder til vores server.
- så lang, så godt :)

men efter det hele er oprettet, og der er opnået forbindelse til ftpen sker der ikke mere, velkomsten fra ftpen sendes heller ikke til klienten (pt. blot telnet).
og beskeder fra klienten sendes ikke til serveren.
- Hvorfor ?

- Er der evt. en anden/bedre måde at lave det nævnte system på ?



*KILDE*

tunnel.java - 21 linjer
import java.io.*;
import java.util.Vector;

public class tunnel
{
    private static final String ver = "0001";
   
    public static void main(String[] args)
    {
        System.out.println ("ALOHA ! Tunnel v. "+ver);
       
        Vector tunnels = new Vector();
        try {
            tunnels.add(new MultiServer("127.0.0.1", 1234, "127.0.0.1", 21));
        }
        catch (IOException e)
        {
            System.out.println ("ERROR : +e");
        }
    }   
}

client.java  -  40 linjer
import java.net.*;
import java.io.*;

public class client
{
    public client(String host, int port, WorkerThread remote)
    {
        try {
            Socket server = new Socket(host, port);
            in = server.getInputStream();
            out = server.getOutputStream();

            din = new DataInputStream( in );
            pout = new PrintStream( out );
           
            String response = din.readLine();
             
            while (response != null)
            {
                System.out.println ("Server data : "+response);
                remote.output.println(response);
                response = din.readLine();
            }
            System.out.println ("Server killed us?");
            server.close();
        } 
        catch (IOException e ) { System.out.println ("ERROR : "+e); }
    }
   
    public void writeData(String str)
    {
        pout.println(str);
    }
   

    private InputStream in;
    private OutputStream out;
    private DataInputStream din;
    public PrintStream pout;
}

WorkerThread.java - 53 linjer
//WorkerThread.java - handle one connection
import java.io.*;
import java.net.*;

class WorkerThread extends Thread {
  WorkerThread(Socket socket, String aip, int aport)
  {
    clientSocket = socket;
    workerNumber++;
    number = workerNumber;
    ip=aip;
    port=aport;
  }
  public void run()
  {
    try {
      input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
      output = new PrintWriter(clientSocket.getOutputStream());

      System.out.println("Connection " + number + " established.");

      output.println("+OK Tunnel service ready.");
      output.flush();
        //We need to create a client connection to our remote server and send all data to this conn.
        //Save the object of our clientconn here, and send either this object or the thread within to the client conn,
   
      client remote = new client(ip, port, this);
     
      String line = input.readLine();
      while (line != null)
      {
          System.out.println ("Client data : "+line);
          remote.pout.println(line);
          line = input.readLine();
      }
      System.out.println ("Client "+number+" died");
    }
    catch (IOException e) {
      System.out.println( e );
    }
  }

  public int getnumber () { return number; }
 
  private Socket clientSocket;
  private static int workerNumber = 0;
  private int number;
  private int port;
  private String ip;
  private BufferedReader input;
  public PrintWriter output;
 
}


MultiServer.java - 24 linjer
import java.io.*;
import java.net.*;

class MultiServer {
  public MultiServer (String bindip, int bindport, String hostip, int hostport)
  throws java.io.IOException
  {
    ServerSocket sock = null;
    try {
      sock = new ServerSocket(bindport);
    }
    catch (IOException e) {
      System.out.println("Could not listen on port: " + bindport + ", " + e);
      System.exit(1);
    }
   
    System.out.println("Now listening at port " + bindport);
    Socket clientSocket = null;
    while (true) {
      try {
        clientSocket = sock.accept();
      }
      catch (IOException e) {
        System.out.println("Accept failed: " + bindport + ", " + e);
        System.exit(1);
      }
      WorkerThread worker = new WorkerThread(clientSocket, hostip, hostport);
      worker.start();
    }
  }
}
Avatar billede disky Nybegynder
26. februar 2003 - 19:38 #1
I din MultiServer.java opretter du et WorkerThread object og starter det, men hvis der lige efter kommer endnu en accept, laver du et nyt object der så overskriver det gamle.

Lav et array af WorkerThread's istedet, og hold styr på hvilke der lever.

Din MultiServer har du sagt throw'er IOException, men alligevel catcher du dem, en af tingene er nok.
Avatar billede mora Nybegynder
26. februar 2003 - 19:48 #2
Hvis jeg fjerner den throw kommer der en fejl.

X:\tunnel>javac client.java tunnel.java MultiServer.java WorkerThread.java
tunnel.java:16: exception java.io.IOException is never thrown in body of corresp
onding try statement
                catch (IOException e)
                ^
Note: client.java uses or overrides a deprecated API.
Note: Recompile with -deprecation for details.
1 error


har lavet multiserver om
linje 10 : Vector connections = new Vector();
linje 30:
      connections.add(new WorkerThread(clientSocket, hostip, hostport));
      WorkerThread worker = (WorkerThread)connections.lastElement();
      worker.start();     


virker stadig ikke, samme problemer
Avatar billede disky Nybegynder
26. februar 2003 - 19:54 #3
fejlen kommer fordi du catcher en exception der ikke kan komme
Avatar billede arne_v Ekspert
26. februar 2003 - 19:55 #4
disky>

Han overskriver ikke hans object.

Han overskriver referancen til hans object med referancen til
et nyt object.

Men threaden skal køre fint videre af den grund (den bliver ikke
GC'et da dens ThreadGroup har en referance til den).

Så det kan ikke forklare at det ikke virker,

Vi er helt enige om at det ikke er pænt at have
nogle threads kørende som man ikke har en direkte
referance til.
Avatar billede disky Nybegynder
26. februar 2003 - 20:25 #5
arne:
Du har ret, jeg fik formuleret mig lidt dårligt.
Avatar billede arne_v Ekspert
26. februar 2003 - 21:09 #6
Der er flere ting i koden som bekymrer mig.

1)  Du ved ikke hvornår dine tråde er færdige (jævnfør tidligere kommentarer)
2)  Du blander temmelig mange Input/Output klasser og nogle
    af dem er ikke egnede til binære data.
3)  Jeg kan ikke se hvordan du vil få output sendt tilbage.
4)  FTP protokollen er en relativt svær protokol at implementere
    (sammelignet med f.eks. HTTP)
Avatar billede mora Nybegynder
26. februar 2003 - 22:02 #7
jeg skal ikke kunne overføre binære data, men kun køre main connection igennem programmet
altså tcp
Avatar billede arne_v Ekspert
26. februar 2003 - 22:19 #8
Så du vil bruge nogle andre klasser til data connection (jeg formoder du mener
control connection med main connection).
Avatar billede arne_v Ekspert
26. februar 2003 - 22:22 #9
Har du overvejet at bruge noget eksisterende kod ei.s.f. at lave alt fra
scratch ?

Der må f.eks. være nogle nyttige ting i.
  http://jakarta.apache.org/commons/net/
Avatar billede mora Nybegynder
27. februar 2003 - 00:06 #10
nej, jeg har ik andre connections.

FTP har en "main" forbindelse, der indeholder kommandoer til serveren og visse svar, men data forbindelserne kører ikke via denne tråd, der sendes en port til serveren og server + klient aftaler transfer udenfor proxyien.

kigger på linket i morgen, kunne ik finde noget opensource der ku det, ellers ville jeg da tjekke det :)

Mit forsøg er mest en IRC bot splittet ad og sat sammen med en http server :)
Avatar billede mora Nybegynder
27. februar 2003 - 22:02 #11
Virker fint, tark =)
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