2016-11-25 3 views
0

Ich habe vor kurzem versucht, Server-Programmierung in Java zu tun, und ich wollte eine einfache Konsole Server-Interaktion erstellen.Java Socket/Server Programmierung: Socket ist nicht verbunden

Das Problem, das ich habe, ist, wann immer der Server läuft, es stürzt immer mit dem Hauptfehler ab, der eine Sockenausnahme ist. Hier

ist der Code:

SOK_CLIENT Klasse:

import java.io.*; 
import java.net.*; 

public class SOK_CLIENT 
{ 
public static void main(String[] args) throws Exception 
{ 
SOK_SERVER SERVER = new SOK_SERVER(); 
SOK_CLIENT CLIENT = new SOK_CLIENT(); 
CLIENT.run(); 
} 
public void run() throws Exception 
{ 
Socket SOCK = new Socket("localhost", 1025); 
PrintStream PS = new PrintStream(SOCK.getOutputStream()); 
PS.println("Hello to Server From Client"); 

InputStreamReader IR = new InputStreamReader(SOCK.getInputStream()); 
BufferedReader BR = new BufferedReader(IR); 

String MESSAGE = BR.readLine(); 
System.out.println(MESSAGE); 
} 
} 

Hier ist die SOK_SERVER Klasse: (wo der Fehler liegt)

import java.io.*; 
import java.net.*; 

public class SOK_SERVER 
{ 
    public SOK_SERVER() 
{ 
try 
{ 
    run(); 
} 
catch(Exception e) 
{ 
    e.printStackTrace(); 
} 
} 
public void run() throws Exception 
{ 
int PORT = 1025; 
ServerSocket SRVSOCKET = new ServerSocket(PORT); 
Socket SOCK = new Socket(); 
System.out.println("Server Starting at Port: " + PORT); 
InputStreamReader IR = new InputStreamReader(SOCK.getInputStream()); 
BufferedReader BR = new BufferedReader(IR); 
String MESSAGE = BR.readLine(); 
System.out.println(MESSAGE); 
if(MESSAGE != null) 
{ 
PrintStream PS = new PrintStream(SOCK.getOutputStream()); 
PS.println("Message Recieved"); 
} 
} 
} 

Ausnahme:

java.net.SocketException: Socket is not connected 
at java.net.Socket.getInputStream(Socket.java:796) 
at SOK_SERVER.run(SOK_SERVER.java:31) 
at SOK_SERVER.<init>(SOK_SERVER.java:16) 
at SOK_CLIENT.main(SOK_CLIENT.java:8) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at edu.rice.cs.dynamicjava.symbol.JavaClass$JavaMethod.evaluate(JavaClass.java:362) 
at edu.rice.cs.dynamicjava.interpreter.ExpressionEvaluator.handleMethodCall(ExpressionEvaluator.java:92) 
at edu.rice.cs.dynamicjava.interpreter.ExpressionEvaluator.visit(ExpressionEvaluator.java:84) 
at koala.dynamicjava.tree.StaticMethodCall.acceptVisitor(StaticMethodCall.java:121) 
at edu.rice.cs.dynamicjava.interpreter.ExpressionEvaluator.value(ExpressionEvaluator.java:38) 
at edu.rice.cs.dynamicjava.interpreter.ExpressionEvaluator.value(ExpressionEvaluator.java:37) 
at edu.rice.cs.dynamicjava.interpreter.StatementEvaluator.visit(StatementEvaluator.java:106) 
at edu.rice.cs.dynamicjava.interpreter.StatementEvaluator.visit(StatementEvaluator.java:29) 
at koala.dynamicjava.tree.ExpressionStatement.acceptVisitor(ExpressionStatement.java:101) 
at edu.rice.cs.dynamicjava.interpreter.StatementEvaluator.evaluateSequence(StatementEvaluator.java:66) 
at edu.rice.cs.dynamicjava.interpreter.Interpreter.evaluate(Interpreter.java:77) 
at edu.rice.cs.dynamicjava.interpreter.Interpreter.interpret(Interpreter.java:47) 
at edu.rice.cs.drjava.model.repl.newjvm.InterpreterJVM.interpret(InterpreterJVM.java:246) 
at edu.rice.cs.drjava.model.repl.newjvm.InterpreterJVM.interpret(InterpreterJVM.java:220) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:303) 
at sun.rmi.transport.Transport$1.run(Transport.java:159) 
at java.security.AccessController.doPrivileged(Native Method) 
at sun.rmi.transport.Transport.serviceCall(Transport.java:155) 
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790) 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) 
at java.lang.Thread.run(Thread.java:695 
+1

Hinweis: Sie uns unsere Zeit verbringen möchten, Ihnen zu helfen, so bitte die * Vorschau * Funktionalität nutzen und sicherstellen, ** alle ** Ihres Codes ordnungsgemäß formatiert/eingekerbten . Und lesen Sie bitte über Java-Code-Stil Richtlinien. Die Namen, die Sie für Ihre Klassen und Variablen verwenden, machen mein Gehirn weh. Im Ernst: So wie du deinen Code schreibst, ist er 10 Mal schwerer zu lesen als er eigentlich sein sollte. Bedeutung: Es braucht uns 10 Mal die Energie, um Ihnen zu helfen. – GhostCat

+0

Entschuldigung! Dies war wirklich mein erster Versuch, die ganze Klammer auf Single-Line-Sache zu machen! Ich werde versuchen, es in der Zukunft zu beheben –

+0

Froh, das zu hören; Aber nur für den Rekord: Benennung ist so wichtig für die Lesbarkeit wie Formatierung ist. Es ist sogar noch wichtiger, denn schlechte Formatierung kann mechanisch durch Werkzeuge behoben werden. Schlechte Namen ... nun, das wird immer ** manuelle ** Arbeit erfordern. – GhostCat

Antwort

2

Yo u sollte Socket SOCK = new Socket(); in Ihrem Server-Code zu Socket SOCK = SRVSOCKET.accept();

+0

Die Sache damit ist, wenn ich es laufe, funktioniert der Code einfach nicht! Wie es nicht einmal den Server startet –

+0

@BWithehead Was ist der Fehler, den Sie nach der obigen Änderung erhalten? – iNan

+0

Was passiert ist, passiert wirklich nichts. Es mag seltsam erscheinen, aber es gibt keine Fehler, alles, was es sagt, ist SOK_CLIENT ausgeführt. Könnte es sein, dass die IDE verwendet wird? –

-1

ändern versuchen

Socket SOCKET = new Socket(); 

SOCKET = SRVSOCKET.accept(); 

beide Klassen Implementiert Runnable und instanziiert als Thema

und rufen Sie starten() -Methode .. nicht ausgeführt()

SOCK_CLIENT implements Runnable 
SOCK_SERVER implements Runnable 

unter Ihrer Hauptmethode

SOK_SERVER SERVER = new SOK_SERVER(); 
SOK_CLIENT CLIENT = new SOK_CLIENT(); 
Thread t1 = new Thread(SERVER); 
Thread t2 = new Thread(CLIENT); 

t1.start(); 
t2.start(); 

Und entfernen run(); von SOCK_SERVER Konstruktor

+3

Wenn Sie versuchen, etwas Reputation zu bekommen, indem Sie einfach kopieren, was eine andere Person bereits geschrieben hat; versuchen Sie zumindest, die Formatierung richtig zu machen. Und vielleicht fügen Sie eine Erklärung mit Ihren eigenen Worten hinzu. – GhostCat

+0

Die Initialisierung zu 'new Socket()' ist sinnlos und verschwenderisch, da es ein Ressourcenleck erzeugt. – EJP