Toon posts:

[java] 2 sockets bufferen en data doorspelen

Pagina: 1
Acties:

Verwijderd

Topicstarter
heeyzz tweakers,

Ik ben al erg ver gekomen vind ik. Ik wil dus een bouncer maken die luistert op de ene poort en alles door geeft aan de andere, en omgekeerd. Het is me gelukt om bij één van de connecties een buffer te maken waardoor het niet gaat flippen als er teveel data binnenstroomt.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  echoServer = new ServerSocket(9999);
       clientSocket = echoServer.accept();
       is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
       os = new PrintWriter(clientSocket.getOutputStream());

       smtpSockets = new Socket("xxx.xxxxx.xxx", xxxx);
       iss = new BufferedReader(new InputStreamReader(smtpSockets.getInputStream()));
       oss = new PrintWriter(smtpSockets.getOutputStream(), true);
//begin buffer van socket (iss)
       char charBuffer[] = new char[1];
       while(iss.read(charBuffer,0,1) != -1) {
       StringBuffer sstringBuffer = new StringBuffer(8192);
       while(charBuffer[0] != '\0') {
            sstringBuffer.append(charBuffer[0]);
            iss.read(charBuffer, 0 ,1);
       }
       os.write(sstringBuffer.toString());
       os.flush();
       }
//end


Mijn probleem is dat ik de 2e buffer voor de socket is er niet in kan bouwen. Eigenlijk moeten er in het loopje naar 2 sockets geluisterd worden, ge bufferd worden, en doorgespeeld worden zonder dat er data verloren gaat. Ik ben al 2 weken denk ik bezig met dit scriptje, ik vind dat ik ver ben gekomen :). Kan iemand mij een zetje geven waarmee ik verder kan :? ?.

Greetzz Jeffrey

Verwijderd

maak twee threads

Verwijderd

Topicstarter
Kan je een voorbeeld geven, het zegt me niet veel een thread

  • Joove
  • Registratie: Januari 2001
  • Laatst online: 09:06
Een thread is een process in je processor. Zoals je je ook meerdere windows programma's te gelijk 'lees zeer snel afwisselend' kunt draaien.

Het voordeel is dus dat je 2 processen kunt draaien. De ene luisterd naar socket 1 en de andere luisterd naar socket 2 ect.

Ik weet zelf alleen niet hoe je zoiets moet doen, dat je java ding het doorgeeft van de ene naar de andere thread.

Zie bijvoorbeeld http://www.eprogrammeur.n...fccea6313405ca59bef22ca6d

Zoek ook eens bij google naar 'java socket thread' misschien ook een idee om te kijken hoe een javachatprogramma werkt met meerde gebruikers, dit lijkt er natuurlijk heel erg op, alleen jij wilt geen tekst doorzenden maar gegevens.

Verwijderd

ongeveer zo, zal weinig van kloppen...
in je main class die je iets van

SynchedSocketl_SynchedSocket = new SynchedSocket(l_ServerSocket.accept());
l_SycnedSocket.setOtherSocket(m_SMTPSocket); // of hoe het ding ook heet..
l_SynchedSocket.start();

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
public class SynchedSocket extends Thread
{
    private Socket m_Socket;
    private SynchedSocket m_OtherSocket;
    private boolean m_Continue = true;
    
    public SynchedSocket(Socket a_Socket)
    {
        m_Socket = a_Socket;
    }
    
    
    public setOtherSocket(SynchedSocket a_OtherSocket)
    {
        m_OtherSocket = a_OtherSocket;
    }
    
    public void run()
    {
        if( null == m_OtherSocket)
        {
            System.out.println("Other Socket not set..");
            return;
        }
        try
        {
            m_Continue = true;
            Reader l_Reader = new Reader(m_Socket.getInputStream()); // init de reader die je wilt met m_Socket
            while( m_Continue )
            {
                m_OtherSocket.write(l_Reader.read()); // tis maar een voorbeeld....
            }
        }
        catch(IOException a_Exception)
        {
            // jadda jadda
        }
    }
    
    public void discontinue()
    {
        m_Continue = false;
    }
    
    public void write(byte[] a_Bytes)
    {
        try
        {
            m_Socket.write(a_Bytes);
            m_Socket.flush();
        }
        catch(IOException e)
        {
        }
    }

}

Verwijderd

Sorry Fladder, ik snap niet veel van je script.
Maar van die topic op e-programmeur heb ik wel wat. Daar zie ik b.v ook hoe ze een nieuwe thread maken. ik ga er mee aan de slag. Als ik problemen heb zeg ik ze wel. Tog allen bedankt!!
Ltrzz!!

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Volgens mij kun je een PipedStream gebruiken om te kunnen communiceren tussen 2 threads. maar zou je even op moeten zoeken.

Verwijderd

Mijn oplossing:
klasse 1:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class InputToOutput implements Runnable{
  private boolean active = true;
  private InputStream in;
  private OutputStream out;

  public InputToOutput() {

  }

  public void setInputStream(InputStream is){
    in = is;
  }

  public void setOutputStream (OutputStream os){
    out = os;
  }

  public void run(){
    byte[] bytes = new byte[1024];
    int count = 0;
    while (active){
      try {
        int i = in.read();
        if (i == -1){
          active = false;
        }
        bytes[count] = (byte) i;
        count++;
        if (count == 1024){
          out.write(bytes);
          System.out.println(new String(bytes));
          count = 0;
        } else if (i == 10 ||  i == 13){
          out.write(bytes,0,count);
          System.out.println(new String(bytes));
          count = 0;
        }
      }
      catch (IOException ex) {
        active = false;
      }
    }
  }
}


klasse 2:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class RelayServer implements Runnable {
  public RelayServer() {
    try {
      ServerSocket ssock = new ServerSocket(34);
      Socket ss = ssock.accept();
      Socket cs = new Socket("127.0.0.1",21);
      InputToOutput ito1 = new InputToOutput();
      InputToOutput ito2 = new InputToOutput();
      ito1.setInputStream(ss.getInputStream());
      ito1.setOutputStream(cs.getOutputStream());
      ito2.setInputStream(cs.getInputStream());
      ito2.setOutputStream(ss.getOutputStream());
      Thread t1 = new Thread(ito1);
      t1.start();
      Thread t2 = new Thread(ito2);
      t2.start();
      System.out.println("relay server online");
    }
    catch (IOException ex) {
    }
  }

  public static void main(String[] args) {
    RelayServer relayServer1 = new RelayServer();
  }


  public void run() {

  }

}


Niet de meest efficiente manier, maar het werkt wel. Toevallig vorige week gemaakt.. :)

[ Voor 1% gewijzigd door Verwijderd op 06-03-2003 13:47 . Reden: typo ]


Verwijderd

Topicstarter
hey bedankt, ik ga hem uitproberen. Je hoort nog van me :)

[ Voor 56% gewijzigd door Verwijderd op 06-03-2003 15:13 ]


Verwijderd

Topicstarter
oke, probleem. Ik merkte dat hij bytes leest en bytes doorzend. Maar ik kan nergenst zeggen van zet er "==END==" achter. Dit wil ik namelijk achter elke regel hebben. Maar aangezien de bytes niet gelezen kunnen worden, waarschijnlijk omdat het binair is kan ik het end-teken van mij er niet achter zetten. kan dit opgelost worden?:)

Verwijderd

Topicstarter
k heb iets gevonden waarmee ik weer een tijdje kan programmeren, ltrzz

Verwijderd

Topicstarter
Hij werkt :D. Bedankt iedereen!!, oja, ff klein vraagje, hoe kan ik zeg maar zeggen van split de data , plaats in een array bij elke enter ("/n"). (in flash vergelijkbaar met data.split("/n"); , en in PHP vergelijkbaar met $dataArray=explode("\n", $data); ) toepassen in java??

[ Voor 50% gewijzigd door Verwijderd op 06-03-2003 21:38 . Reden: duidelijker :D ]


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Met een StringTokenizer kan dat.

Verwijderd

Ik weet niet of je die code van mij nog gebruikt, maar als er een \n of \r (char 10 of char 13) wordt gelezen, dan wordt het gelezen blok doorgestuurd. En bij -1 is de input stream afgesloten, dus dan stopt de lees-thread er maar mee... Misschien kun je daar nog wat mee...

Verwijderd

Topicstarter
ja, maar met jouw systeem kon ik de data niet lezen, vreemd. Ik heb er zelf een systeempje ingezet en het werkt. Nu kan ik de data ook lezen (ik bedoel, in jouw systeem wordt het binair doorgegeven, bij mij niet) Dus kan ik in de applet de data lezen en acties alvast uitvoeren/ Ik zal het proberen nog Wasigh!

Verwijderd

fuck foutje, slotje?

[ Voor 94% gewijzigd door Verwijderd op 25-01-2004 01:39 ]

Pagina: 1