Avatar billede ultragames Nybegynder
26. juni 2005 - 23:35 Der er 18 kommentarer og
1 løsning

simpel socket

Hej eksperter.. er igang med at følge en tut fra udvikleren om ntværks programmering!..

import java.net.ServerSocket;
import java.net.Socket;
import java.net.InetAddress;
import java.net.BindException;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

class EchoServer {

    public static void main(String[] args) {
    final int port = 800; //porten vi vil lytte på.

    System.out.println("[server] Starter echo server på port "+port);

    ServerSocket srv = null;
    try {
        srv = new ServerSocket(port);
    } catch (BindException be) {
        System.out.println("[server] Kunne ikke lytte på "+port);
        System.exit(1);
    } catch (IOException e) {
        System.out.println("[server] Kunne ikke åbne server-socket");
        e.printStackTrace();
        System.exit(1);
    }

    Socket sock = null;
    try {
        while ((sock = srv.accept()) != null) {
        InetAddress remoteHost = sock.getInetAddress();
        int remotePort = sock.getPort();
        System.out.println("[server] Accepterede forbindelse fra "+
                  remoteHost.getHostAddress()+
                  ":"+remotePort);

        InputStream in = sock.getInputStream(); //Stream til indkommende data
        OutputStream out = sock.getOutputStream(); //Stream til udgående data


        byte[] buffer = new byte[16384]; //16kb buffer
        while (true) {
            /* InputStream's read(byte[], int, int) metode returnerer enten:
              Antallet af læste tegn
              -1, hvis der ikke kunne læses data (Hvis slutningen af streamen er nået).
            */
            int read = in.read(buffer, 0, buffer.length); //læs op til MAX_SIZE tegn.

            if (read == -1)
            break; //echo ikke hvis der ikke kunne læses data

            out.write(buffer, 0, read); //skriv tegn tilbage til klienten
        }
        System.out.println("[server] Forbindelse afbrudt..");
        }
    } catch (IOException e) {
        System.out.println("[server] Fejl: Input/Output fejl");
        e.printStackTrace();
        System.exit(1);
    }
    }
}


dette er min kildekode..

lige meget hvilken port jeg prøver at lytte på.. kan jeg ikke lytte på den.. hvorfor?
Avatar billede arne_v Ekspert
26. juni 2005 - 23:39 #1
hvilken fejl får du ?
Avatar billede arne_v Ekspert
26. juni 2005 - 23:40 #2
Linux (ja de fleste ikke Microsoft styresystemer) tillader ikke upriviligerede
brugere at lytte på port numre < 1024
Avatar billede ultragames Nybegynder
26. juni 2005 - 23:40 #3
System.out.println("[server] Kunne ikke lytte på "+port);

eller: "[server] Kunne ikke lytte på 800"
Avatar billede arne_v Ekspert
26. juni 2005 - 23:42 #4
prøv lige:

try {
        srv = new ServerSocket(port);
    } catch (BindException be) {
        be.printStackTrace();
        System.exit(1);
    } catch (IOException e) {
        e.printStackTrace();
        System.exit(1);
    }
Avatar billede ultragames Nybegynder
26. juni 2005 - 23:42 #5
jeg får også fejlen på port 10000 fx
Avatar billede ultragames Nybegynder
26. juni 2005 - 23:43 #6
[server] Starter echo server på port 10000
java.net.BindException: Address already in use: JVM_Bind
    at java.net.PlainSocketImpl.socketBind(Native Method)
    at java.net.PlainSocketImpl.bind(Unknown Source)
    at java.net.ServerSocket.bind(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)
    at EchoServer.main(EchoServer.java:19)



det er med denne kode (den rettede med dit ofrslag):

import java.net.ServerSocket;
import java.net.Socket;
import java.net.InetAddress;
import java.net.BindException;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

class EchoServer {

    public static void main(String[] args) {
    final int port = 10000; //porten vi vil lytte på.

    System.out.println("[server] Starter echo server på port "+port);

    ServerSocket srv = null;
    try {
        srv = new ServerSocket(port);
    } catch (BindException be) {
        be.printStackTrace();
        System.exit(1);
    } catch (IOException e) {
        e.printStackTrace();
        System.exit(1);
    }
    Socket sock = null;
    try {
        while ((sock = srv.accept()) != null) {
        InetAddress remoteHost = sock.getInetAddress();
        int remotePort = sock.getPort();
        System.out.println("[server] Accepterede forbindelse fra "+
                  remoteHost.getHostAddress()+
                  ":"+remotePort);

        InputStream in = sock.getInputStream(); //Stream til indkommende data
        OutputStream out = sock.getOutputStream(); //Stream til udgående data


        byte[] buffer = new byte[16384]; //16kb buffer
        while (true) {
            /* InputStream's read(byte[], int, int) metode returnerer enten:
              Antallet af læste tegn
              -1, hvis der ikke kunne læses data (Hvis slutningen af streamen er nået).
            */
            int read = in.read(buffer, 0, buffer.length); //læs op til MAX_SIZE tegn.

            if (read == -1)
            break; //echo ikke hvis der ikke kunne læses data

            out.write(buffer, 0, read); //skriv tegn tilbage til klienten
        }
        System.out.println("[server] Forbindelse afbrudt..");
        }
    } catch (IOException e) {
        System.out.println("[server] Fejl: Input/Output fejl");
        e.printStackTrace();
        System.exit(1);
    }
    }
}
Avatar billede arne_v Ekspert
26. juni 2005 - 23:43 #7
generelt med hensyn til sockets kan du se en del kode her:
  http://www.eksperten.dk/artikler/515

(der er også C# og VB.NET kode, men du kan jo nøjes med at læse Java koden)
Avatar billede arne_v Ekspert
26. juni 2005 - 23:44 #8
java.net.BindException: Address already in use: JVM_Bind

noget holder på porten !

du har recompilet efter du har ændret port nummer ? og du har forsøgt med adskillige
port numre ?

har du en firewall som blokerer ?
Avatar billede ultragames Nybegynder
26. juni 2005 - 23:45 #9
en gang i mellem virker en port.. så prøver jeg at køre programmet igen!.. så virker det ikke.. kan det være at porten ikke blive "lukket efter brug"?
Avatar billede ultragames Nybegynder
26. juni 2005 - 23:45 #10
jeg har en firewall på min router..
Avatar billede arne_v Ekspert
26. juni 2005 - 23:48 #11
får du serveren lukket ned inden du starter igen ?
Avatar billede ultragames Nybegynder
26. juni 2005 - 23:50 #12
jeg kører den i eclipse (da min command consol automatisk lukker ned direkte efter start)--... AAAH!.. har lige fundet ud af at jeg glemte at "terminate" programmet i eclipse... troede at den selv gjorde det..!..

forrestsen!..har også en client del, kan jeg bare køre den i eclipse bagefter?.. og så burde den kunne læse ?
Avatar billede ultragames Nybegynder
26. juni 2005 - 23:53 #13
JAAAA :D.. det virker.. takker.. forrestn.. kan du fortælle mig hvorfor at min cmd lukker igen lige så snart jeg går i "kør -> 'cmd'"?.. det er rigtig irriterende
Avatar billede arne_v Ekspert
26. juni 2005 - 23:54 #14
du kan godt køre både server og client fra eclipse

jeg synes at det er lidt svært at overskue hvad der sker på den måde, men ...
Avatar billede arne_v Ekspert
26. juni 2005 - 23:55 #15
jeg plejer altid at gå i accessories og åbne command prompt der
Avatar billede ultragames Nybegynder
26. juni 2005 - 23:57 #16
det kan jeg heller ikke!... der lukker den også!.. jeg har ikke pillet ved noget :(
Avatar billede arne_v Ekspert
27. juni 2005 - 00:01 #17
mystisk

det har jeg aldrig set før
Avatar billede ultragames Nybegynder
27. juni 2005 - 00:05 #18
ok!... nedtur!.. men lig da et svar :D og tak for hjælpen
Avatar billede arne_v Ekspert
27. juni 2005 - 00:08 #19
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