2016-11-25 175 views
0

我一直在努力嘗試在Java中進行服務器編程,並且我想創建一個簡單的控制檯服務器交互。Java套接字/服務器編程:套接字未連接

我遇到的問題是,每當服務器運行時,它總是崩潰,主要錯誤是套接字異常。

下面是代碼:

SOK_CLIENT類別:

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

這裏是SOK_SERVER類:(其中,誤差是位於)

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"); 
} 
} 
} 

例外:

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

提示:你要我們花時間來幫助你,所以請使用*預覽*功能,確保所有** **你的代碼是正確的格式/縮進。並請閱讀關於Java編碼風格指南。你用於你的類和變量的名字會讓我的大腦受傷。認真地說:就像你寫代碼的方式一樣,它的讀取難度要比它應該高10倍。含義:它需要我們10倍的能量來幫助你。 – GhostCat

+0

對不起!這是我第一次嘗試在單線上做整個支架!我試着修復它在未來 –

+0

很高興聽到這個;但只是爲了記錄:命名與格式化的可讀性同等重要。它實際上更重要,因爲糟糕的格式化可以通過工具機械地修復。不好的名字......好吧,那總是需要**手動**工作。 – GhostCat

回答

2

呦ü應該在你的服務器代碼更改Socket SOCK = new Socket();Socket SOCK = SRVSOCKET.accept();

+0

與此相關的事情是,只要我運行它,代碼只是不起作用!喜歡它甚至不啓動服務器 –

+0

@BWhitehead上述修改後,您得到什麼錯誤? – iNan

+0

發生什麼事情並沒有真正發生。它可能看起來很奇怪,但沒有錯誤,它說的是運行SOK_CLIENT。它可能是IDE即時使用? –

-1

嘗試

Socket SOCKET = new Socket(); 

SOCKET = SRVSOCKET.accept(); 

同時實現Runnable接口的類和實例爲主題

,並調用start()方法..不能運行()

SOCK_CLIENT implements Runnable 
SOCK_SERVER implements Runnable 

您的主要方法

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(); 

而且從SOCK_SERVER構造函數刪除run();

+3

當你試圖通過複製另一個人已經寫的東西來獲得某種聲望時;至少嘗試獲得格式化權利。也許用你自己的話來添加一些解釋。 – GhostCat

+0

「new Socket()」的初始化既沒有意義也浪費,因爲它會造成資源泄漏。 – EJP