Weiterer Thread auf Port 843 horcht

DennisG

Mitglied
Hallo,
in meinen Code einen weiteren Thread einbauen der auf Port 843 horcht...
also das ist mein ausgangs Code:

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
 
public class EchoServers
{        
    ServerSocket m_ServerSocket;
    
    ArrayList<Socket> clients = new ArrayList<Socket>();
    
    public EchoServers() 
    {
        try
        {
            // Create the server socket.
            m_ServerSocket = new ServerSocket(2005);
        }
        catch(IOException ioe)
        {
            System.out.println("Could not create server socket at 2005. Quitting.");
            System.exit(-1);
        }
        
        System.out.println("Listening for clients on 2005...");
        
        // Successfully created Server Socket. Now wait for connections.
        int id = 0;
        while(true)
        {                        
            try
            {
                // Accept incoming connections.
                Socket clientSocket = m_ServerSocket.accept();
                clients.add(clientSocket);
                // accept() will block until a client connects to the server.
                // If execution reaches this point, then it means that a client
                // socket has been accepted.
                
                // For each client, we will start a service thread to
                // service the client requests. This is to demonstrate a
                // multithreaded server, although not required for such a
                // trivial application. Starting a thread also lets our
                // EchoServer accept multiple connections simultaneously.
                
                // Start a service thread
                
                ClientServiceThread cliThread = new ClientServiceThread(clientSocket, id++);
                cliThread.start();
            }
            catch(IOException ioe)
            {
                System.out.println("Exception encountered on accept. Ignoring. Stack Trace :");
                ioe.printStackTrace();
            }
        }
    }
    
    public static void main (String[] args)
    {
        new EchoServers();    
    }
    
    
    class ClientServiceThread extends Thread
    {
        Socket m_clientSocket;        
        int m_clientID = -1;
        boolean m_bRunThread = true;
        
        ClientServiceThread(Socket s, int clientID)
        {
            m_clientSocket = s;
            m_clientID = clientID;
        }
       
        public void run()
        {            
            // Obtain the input stream and the output stream for the socket
            // A good practice is to encapsulate them with a BufferedReader
            // and a PrintWriter as shown below.
            BufferedReader in = null; 
            PrintWriter out = null;
            
            // Print out details of this connection
            System.out.println("Accepted Client : ID - " + m_clientID + " : Address - " + 
                             m_clientSocket.getInetAddress().getHostName());
                
            try
            {                                
                in = new BufferedReader(new InputStreamReader(m_clientSocket.getInputStream()));
                out = new PrintWriter(new OutputStreamWriter(m_clientSocket.getOutputStream()));
                
                // At this point, we can read for input and reply with appropriate output.
                
                // Run in a loop until m_bRunThread is set to false
                while(m_bRunThread)
                {                    
                    // read incoming stream
                    String clientCommand = in.readLine();
                    
                    System.out.println("Client Says :" + clientCommand);
                    
                    
                    for (Socket s :clients){
                        
                        out =new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
                        if(clientCommand != null)
                        {
                        out.println(clientCommand);
                        out.flush();
                        }
                    }
                    
                     
                    
                    if(clientCommand.equalsIgnoreCase("k"))
                    {
                        // Special command. Quit this thread
                        m_bRunThread = false;   
                        System.out.print("Stopping client thread for client : " + m_clientID);
                    }
                    
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();  
            }
            finally
            {
                System.out.println("FINALE");
                // Clean up
                try
                {                    
                    in.close();
                    out.close();
                    m_clientSocket.close();
                    System.out.println("...Stopped");
                }
                catch(IOException ioe)
                {
                    ioe.printStackTrace();
                }
            }
        }
    }
}

Nur sobalt ich probiere da einen weiteren Thread einzubauen, kommen nur noch fehler .... ich schaff das einfach nicht, vielleicht könnt ihr mir da ein paar Tipps geben...
hier ist mal der von mir geänderte code:

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
 
public class EchoServers
{        
    ServerSocket m_ServerSocket;
    ServerSocket m_SecureSocket;
    
    ArrayList<Socket> clients = new ArrayList<Socket>();
    ArrayList<Socket> secureclients = new ArrayList<Socket>();
    
    public EchoServers() 
    {
        try
        {
            // Create the server socket.
            m_ServerSocket = new ServerSocket(2005);
        }
        catch(IOException ioe)
        {
            System.out.println("Could not create server socket at 2005. Quitting.");
            System.exit(-1);
        }
        
        System.out.println("Listening for clients on 2005...");
        
        
        try
        {
            // Create the server socket.
            m_SecureSocket = new ServerSocket(843);
        }
        catch(IOException ioe)
        {
            System.out.println("Could not create server socket at 843. Quitting.");
            System.exit(-1);
        }
        
        System.out.println("Listening for clients on 843...");
        
        
        // Successfully created Server Socket. Now wait for connections.
        int id = 0;
        int sid = 0;
        while(true)
        {                        
            try
            {
                // Accept incoming connections.
                Socket clientSocket = m_ServerSocket.accept();
                clients.add(clientSocket);
                // accept() will block until a client connects to the server.
                // If execution reaches this point, then it means that a client
                // socket has been accepted.
                
                // For each client, we will start a service thread to
                // service the client requests. This is to demonstrate a
                // multithreaded server, although not required for such a
                // trivial application. Starting a thread also lets our
                // EchoServer accept multiple connections simultaneously.
                
                // Start a service thread
                
                ClientServiceThread cliThread = new ClientServiceThread(clientSocket, id++);
                cliThread.start();
            }
            catch(IOException ioe)
            {
                System.out.println("Exception encountered on accept. Ignoring. Stack Trace :");
                ioe.printStackTrace();
            }
            
            
            try
            {
                // Accept incoming connections.
                Socket secureclientSocket = m_SecureSocket.accept();
                secureclients.add(secureclientSocket);
                // accept() will block until a client connects to the server.
                // If execution reaches this point, then it means that a client
                // socket has been accepted.
                
                // For each client, we will start a service thread to
                // service the client requests. This is to demonstrate a
                // multithreaded server, although not required for such a
                // trivial application. Starting a thread also lets our
                // EchoServer accept multiple connections simultaneously.
                
                // Start a service thread
                
                SecureServiceThread secThread = new SecureServiceThread(secureclientSocket, sid++);
                secThread.start();
            }
            catch(IOException ioe)
            {
                System.out.println("Exception encountered on accept. Ignoring. Stack Trace :");
                ioe.printStackTrace();
            }
        }
    }
    
    public static void main (String[] args)
    {
        new EchoServers();    
    }
    
    class SecureServiceThread extends Thread
    {
        Socket m_secureSocket;  
        int m_clientID = -1;
        boolean m_bRunThread = true;
        SecureServiceThread(Socket s, int clientID)
        {
            System.out.println("HIER PASSIERT NICHTS!!! :(");
            m_secureSocket = s;
            m_clientID = clientID;
        }
        
    }
    
    
    class ClientServiceThread extends Thread
    {
        Socket m_clientSocket;        
        int m_clientID = -1;
        boolean m_bRunThread = true;
        
        ClientServiceThread(Socket s, int clientID)
        {
            m_clientSocket = s;
            m_clientID = clientID;
        }
       
        public void run()
        {            
            // Obtain the input stream and the output stream for the socket
            // A good practice is to encapsulate them with a BufferedReader
            // and a PrintWriter as shown below.
            BufferedReader in = null; 
            PrintWriter out = null;
            
            // Print out details of this connection
            System.out.println("Accepted Client : ID - " + m_clientID + " : Address - " + 
                             m_clientSocket.getInetAddress().getHostName());
                
            try
            {                                
                in = new BufferedReader(new InputStreamReader(m_clientSocket.getInputStream()));
                out = new PrintWriter(new OutputStreamWriter(m_clientSocket.getOutputStream()));
                
                // At this point, we can read for input and reply with appropriate output.
                
                // Run in a loop until m_bRunThread is set to false
                while(m_bRunThread)
                {                    
                    // read incoming stream
                    String clientCommand = in.readLine();
                    
                    System.out.println("Client Says :" + clientCommand);
                    
                    
                    for (Socket s :clients){
                        
                        out =new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
                        if(clientCommand != null)
                        {
                        out.println(clientCommand);
                        out.flush();
                        }
                    }
                    
                     
                    
                    if(clientCommand.equalsIgnoreCase("k"))
                    {
                        // Special command. Quit this thread
                        m_bRunThread = false;   
                        System.out.print("Stopping client thread for client : " + m_clientID);
                    }
                    
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();  
            }
            finally
            {
                System.out.println("FINALE");
                // Clean up
                try
                {                    
                    in.close();
                    out.close();
                    m_clientSocket.close();
                    System.out.println("...Stopped");
                }
                catch(IOException ioe)
                {
                    ioe.printStackTrace();
                }
            }
        }
    }
}

Im SecureServiceThread passiert nichts, also die nachricht wird garnicht erst ausgegeben ... :(
 
S

SlaterB

Gast
die Klasse EchoServer solltest du weitgehend unverändert lassen, nur den Port als Paramter sowie vielleicht Namen für Log-Ausgaben usw. (dort auch auf nun variablen Port achten!),
dann startest du den EchoServer zweimal:
Java:
main {
   new Thread() {
      public void run() {
          new EchoServers(portA, descriptionA);  // ein Server
      }
  }.start();
  new EchoServers(portB, descriptionB);  // ein anderer Server, läuft im main-Thread
}
zwei Server brauchen zwei Threads, jeder horcht an seinem Socket,

wenn es unbedingt sein muss, dann musst du die komplette EchoServers-Klasse kopieren,
um parallele Ausführung per Threads oder zwei verschiedene mains/ zwei Programmstarts kommst du aber nicht herum,
wenn die accept() in derselben Methode hintereinander stehen, dann kann immer nur ein Socket bereit sein,
im Moment bei dir abwechselnd
 
Zuletzt bearbeitet von einem Moderator:

schlingel

Gesperrter Benutzer
Ein kleiner Tipp der deine Frage nicht beantwortet aber zum Thema passt: Verwende keine Ports aus der Range 1 bis 1024, das sind die Well Known Ports und für bestimmte Dienste definiert.

Übrigens: Der Port wird von Adobe verwendet, kann es sein, dass dir hier Flash ein Schnippchen schlägt? Schau einmal mit TCPView (wenn du Windows verwendest) welcher Prozess den Port besitzt.

Außerdem: "Nur noch Fehler" ja welche denn, das wäre hilfreich.
 

DennisG

Mitglied
Ein kleiner Tipp der deine Frage nicht beantwortet aber zum Thema passt: Verwende keine Ports aus der Range 1 bis 1024, das sind die Well Known Ports und für bestimmte Dienste definiert.

Übrigens: Der Port wird von Adobe verwendet, kann es sein, dass dir hier Flash ein Schnippchen schlägt? Schau einmal mit TCPView (wenn du Windows verwendest) welcher Prozess den Port besitzt.

Außerdem: "Nur noch Fehler" ja welche denn, das wäre hilfreich.

Ja ich möchte die policy-file-request senden und dies muss wohl auf port 843 geschehen...

ich hab ja eher gedacht das ich mein vorhandenen code einfach kopiere und dann anstatt die daten zurück zu senden einfach das:

Java:
out.println("<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>");
          out.flush();

sende..
 

tagedieb

Top Contributor
Ganz nebenbei. Der Konstruktor ist dazu da eine Klasse zu initialisieren. Das Objekt ist erst dann vollständig erstellt, wenn der Konstruktor beendet wurde. In deinem Fall wird der Konstruktor leider nie beendet sondern du lässt den ganzen Code darin laufen.
Im besten Fall ist das einfach schlechter Style. Im schlimmsten Fall kann dies speziell bei Multithreading unvorhergesehene Sideeffects haben.

Besser du implementierst das Interface Runnable und schiebst den ganzen Code des Echoservers in die run() Methode.
 

FArt

Top Contributor
Ganz nebenbei. Der Konstruktor ist dazu da eine Klasse zu initialisieren. Das Objekt ist erst dann vollständig erstellt, wenn der Konstruktor beendet wurde. In deinem Fall wird der Konstruktor leider nie beendet sondern du lässt den ganzen Code darin laufen.
Im besten Fall ist das einfach schlechter Style. Im schlimmsten Fall kann dies speziell bei Multithreading unvorhergesehene Sideeffects haben.

Besser du implementierst das Interface Runnable und schiebst den ganzen Code des Echoservers in die run() Methode.

Hervorragender Tipp. Als Ergänzung schlage ich noch vor, nicht selber mit Threads zu hantieren, sondern den ExecutorService zu verwenden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand Thread und Ratelimiter Netzwerkprogrammierung 4
F Thread "extern" beenden Netzwerkprogrammierung 3
OnDemand Linux RAM per Thread Netzwerkprogrammierung 3
V Socket Audio Clip loopen ohne neuen Thread Netzwerkprogrammierung 2
C Thread Netzwerkprogrammierung 9
platofan23 Socket Hilfe mit Socket Thread und ArrayList Netzwerkprogrammierung 6
A RMI RMI - Thread Objekte übertragen und auf anderer Machine weiterlaufen lassen Netzwerkprogrammierung 0
S Socket ThreadPool oder Thread pro Client? Netzwerkprogrammierung 11
T Socket Server starten Thread Problem Netzwerkprogrammierung 12
P Wie spreche ich einen Thread an? Netzwerkprogrammierung 20
M Thread Scheduler Java 5.0? Netzwerkprogrammierung 2
7 Mehrere Verbindungen gleichzeitig in einem Thread mit ApacheHTTP Netzwerkprogrammierung 7
D Socket Dynamische Socket-Thread Erzeugung Netzwerkprogrammierung 2
B Socket Thread handling / Reader init Netzwerkprogrammierung 8
Z Socket Socket-Thread falsch? Netzwerkprogrammierung 5
Helgon Socket Thread Pooling Netzwerkprogrammierung 6
M Was macht Thread, wenn er aus einem "leeren" Inputstream liest ? Netzwerkprogrammierung 5
B callback thread udp Netzwerkprogrammierung 2
D RMI und Thread Netzwerkprogrammierung 4
S Kommunikationsproblem, Thread und manuel Netzwerkprogrammierung 4
U Socket Abhören eines Sockets/Ports in extra Thread Netzwerkprogrammierung 8
K ein Thread pro Stream Netzwerkprogrammierung 2
D Thread problem Netzwerkprogrammierung 3
S Thread, Daten vom Socket lesen Netzwerkprogrammierung 2
S Thread Transport Netzwerkprogrammierung 6
S Socket Thread in Schleife Netzwerkprogrammierung 4
G Objekte per TCP verschicken + Thread Netzwerkprogrammierung 4
T synchronized mit thread und rückgabe Netzwerkprogrammierung 4
Q Thread und Sockets... Netzwerkprogrammierung 2
2 Class mit ServerSocket erbt von Thread? Netzwerkprogrammierung 3
PAX Outputstream von anderem Thread verwenden lassen Netzwerkprogrammierung 5
C Server mit Multithreading (Thread-Pool) Netzwerkprogrammierung 2
E java.lang.NullPointerException aber nur wenns im Thread läuf Netzwerkprogrammierung 4
F EIN Thread in RMI auf Serverseite Netzwerkprogrammierung 3
G Server Thread beenden Netzwerkprogrammierung 16
T Socket-Thread: Designfrage Netzwerkprogrammierung 14
S Mit Thread arbeitende Maschine Netzwerkprogrammierung 6
T select() ohne NIO - oder wie Worker-Thread sauber beenden? Netzwerkprogrammierung 9
K Selbe Streams mehrfach nutzen (zusätl. Thread) Netzwerkprogrammierung 6
ven000m Thread Frage Netzwerkprogrammierung 11
B Thread.start() (run()) excption Netzwerkprogrammierung 2
M Thread läuft nicht weiter Netzwerkprogrammierung 2
B NullPointerException | Thread Netzwerkprogrammierung 4
U Current thread not owner Netzwerkprogrammierung 3
S readline-thread stoppt vorzeitig Netzwerkprogrammierung 6
J RMI - (RemoteException occurred in server thread) Netzwerkprogrammierung 2
S Webserverprogrammierung: Thread-Beschränkung Netzwerkprogrammierung 2
M Exception in thread "main" java.lang.NoClassDefFou Netzwerkprogrammierung 2
F problem mit thread bzw. netzwerkverbindung! Netzwerkprogrammierung 3
L netzwerk mit thread Netzwerkprogrammierung 3
G RMI thread safe ? Netzwerkprogrammierung 11
A Thread gibt Nachrichten mehrmals aus (Messenger in Java) Netzwerkprogrammierung 3
JavaDevOp Socket Status von UDP-Port prüfen (PortUnreachableException funktioniert nicht?) Netzwerkprogrammierung 32
FrankenDerStein Socket UDP Multithreading für ein Port Netzwerkprogrammierung 2
T multithreaded multiport socketListener beendet TCP-Port-Listening Netzwerkprogrammierung 16
C Proxy Server - Antwort auf welchem Port Netzwerkprogrammierung 1
precoc Port Listener Netzwerkprogrammierung 2
T Port forwarding Netzwerkprogrammierung 11
Rudolf Socket An welchen Port sendet ein Mailserver zu einem anderen Mailserver Netzwerkprogrammierung 8
C Socket Connection refused bei Internetverbindung - Welcher Port? Netzwerkprogrammierung 5
S Port abhören Netzwerkprogrammierung 11
M Gleicher Port für Senden und Empfangen ? Netzwerkprogrammierung 17
Dit_ UDP Port testen | Ping Google? Netzwerkprogrammierung 7
J Port lauschen Netzwerkprogrammierung 2
H Mysql port forwarding Netzwerkprogrammierung 5
Dit_ UDP Port bestimmen | Windows, MAC, Linux... Netzwerkprogrammierung 2
J UDP port packete lesen,wenn dieser besetzt ist Netzwerkprogrammierung 3
T Java Mail port ändern Netzwerkprogrammierung 4
1 Socket Immer offener Port? Netzwerkprogrammierung 11
R wie prüfe ich ob ein port frei is ? Netzwerkprogrammierung 7
S Port auf einer bestimmten IP-Adresse auslesen? Netzwerkprogrammierung 6
X Port scannen/schicken Netzwerkprogrammierung 4
W scan remote UDP port Netzwerkprogrammierung 6
M Socket Herausfinden ob server auf port läuft Netzwerkprogrammierung 8
F UDP Receive und Send am gleichen Port Netzwerkprogrammierung 3
G Port freigeben Netzwerkprogrammierung 3
P Sockets +Port Forwarding = Chaos Netzwerkprogrammierung 4
J GSM Modem an Serial Port ansteuern (AT commands) Netzwerkprogrammierung 2
T Server ohne Port Netzwerkprogrammierung 4
Schandro Herausfinden ob hinter einem Port bereits ein ServerSocket steckt Netzwerkprogrammierung 2
ABstraCT Applet multipler port Zugriff möglich ? Netzwerkprogrammierung 5
ABstraCT Telnet port Zugriff problem (public IP) Netzwerkprogrammierung 12
T ohne Port Freigabe. Netzwerkprogrammierung 6
K Problem mit Com-Port-Komunikation Netzwerkprogrammierung 57
G "Port already in use" RMI über SSL Netzwerkprogrammierung 9
S port lauschen Netzwerkprogrammierung 2
feuervogel Sockets - Lokalen Port aber nicht IP bestimmen Netzwerkprogrammierung 3
G port scanner Netzwerkprogrammierung 6
S Port mithören Netzwerkprogrammierung 9
P jakarta.HttpClient: Port bei GetMethod angeben Netzwerkprogrammierung 3
A port noch belegt Netzwerkprogrammierung 3
K Port 13 nur einmal abfragbar? Netzwerkprogrammierung 2
R Problem mit mehreren Anfragen auf demselben Port Netzwerkprogrammierung 2
TRunKX Ein Port mehrere Verbindungen? Netzwerkprogrammierung 7
H Port abhören Netzwerkprogrammierung 3
F freien Port finden Netzwerkprogrammierung 7
S GEHT DAS? - Nur eine Frage! (Printer Port direkt ansteuern?) Netzwerkprogrammierung 4
T Kann man jeden Port für Programm verwenden? Netzwerkprogrammierung 2
T PORT 80 überwachen Netzwerkprogrammierung 12
G an port lauschen Netzwerkprogrammierung 10

Ähnliche Java Themen

Neue Themen


Oben