Avatar billede webster Nybegynder
21. oktober 2001 - 11:15 Der er 5 kommentarer

Socket problem

Hejsa, først en smule kode:

    public void run(){

    core.clientConnected();
    try{
        while (dead == false){
        String str = in.readLine();
        if (str != null){
            handleClientMessage(str);
        }
        }

    }catch (Exception e){
        Log.event(\"Exception caught in ConnectionHandler\");
    }finally{
        releaseConnection();
    }

    }

in er en BufferedReader. Mit problem er at jeg ikke kan detekte om clienten lukker forbindelsen. Når det sker begynder koden at proppe data ind i str, og min computer æder al hukommelse op i løbet af 30 sekunder. Min kode har tidligere fungeret ved at jeg læste bytevis fra inputstreamen og tilføjede det til en StringBuffer. Jeg kunne så bruge buffer størrelsen til at detekte om der enten blev sendt for meget data el. forbindelsen var lukket.

Det jeg har brug for er at:

1. Fastlægge en maks input buffer størrelse så at serveren ikke kan nukes ved at sende en masse data.
2. Frigøre forbindelsen når den lukker fra clientens side.

De beskeder jeg modtager fra (vb) klienten afsluttes med en (char)10(char)13. Nogen ideer til hvordan det jeg har kan ændres, eller en anden netværks implementation?
Avatar billede lbhansen Nybegynder
21. oktober 2001 - 16:00 #1
jeg ville prøve noget ála
String endString=((char)10)+((char)13);+\"\";
while(shouldContinue){
  String str = in.readLine();
  if(str == null|| str.endsWith(endString)
      shouldContinue=false;
  else
      handleClientMessage(str);
}
 
Avatar billede webster Nybegynder
21. oktober 2001 - 20:03 #2
ja, men med den løsning bliver den jo ved med at læse fra streamen indtil der kommer et linieskift (ligesom den gør nu).
Avatar billede lbhansen Nybegynder
21. oktober 2001 - 20:14 #3
så kan du jo fortsætte med at læse bytes istedet, så kan du chekke om de indholder char(10)(char)13, og hvis de ikke gør, så kan du tilføje dem til en StringBuffer.

Så snart du finder den karakter kombination, så kan du kalde din handleClientMessage(stringBuffer.toString();

Hvis du læser bytes, kan du samtidig tælle hvor mange du har modtaget, og hvis du har modtaget for mange, så kan du lukke forbindelsen.

Den vil ikke beskytte dig for at blive overbelastet, da en nuke applikation bare vil oprette en ny forbindelse, og fortsætte. Ellers
skal du til at blokere ip adresser
Avatar billede webster Nybegynder
21. oktober 2001 - 21:00 #4
jaja man kan aldrig beskytte sig fuldt ud mod at blive nuket ligesom at der ikke er noget at gøre mod et full scale dos angreb, men det stopper da nogle af nybegynderne fra at gøre skade.

angående at læse bytevis og så tjekke for de 2 characters, hvordan vil du gøre det? Jeg syntes min kode bliver meget kluntet
Avatar billede lbhansen Nybegynder
22. oktober 2001 - 18:40 #5
det er ikke køn kode, og jeg garanterer ikke at det kan compile, men er udelukkende til inspiration. Du burde måske læse flere chars af gangen, og så chekke om den indeholder dine escape karakterer.

char end1=(char)10;
char end2=(char)13;
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
StringBuffer temp = new StringBuffer();
char data[] = new char[16];
boolean startEnd=false;
while(in.read(data,0,1)==1){
    if(data[0]==end1)
        startEnd = true;
    else if(data[0]==end2&&startEnd){
        handleClientMessage(temp.toString());
        startEnd=false;
        temp = new StringBuffer();
    }
    else{
        startEnd=false;
        temp.append(data[0]);

    }
}
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