2012-04-02 67 views
3

收到這些錯誤在一些Java代碼Java服務器實例的錯誤

http://tutorials.jenkov.com/java-multithreaded-servers/multithreaded-server.html

Exception in thread "Thread-0" java.lang.RuntimeException: Cannot open port 8080 
at servers.MultiThreadedServer.openServerSocket(MultiThreadedServer.java:61) 
at servers.MultiThreadedServer.run(MultiThreadedServer.java:22) 
at java.lang.Thread.run(Thread.java:679) 
Caused by: java.net.BindException: Address already in use 
at java.net.PlainSocketImpl.socketBind(Native Method) 
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:353) 
at java.net.ServerSocket.bind(ServerSocket.java:336) 
at java.net.ServerSocket.<init>(ServerSocket.java:202) 
at java.net.ServerSocket.<init>(ServerSocket.java:114) 
at servers.MultiThreadedServer.openServerSocket(MultiThreadedServer.java:59) 
... 2 more 
    Exception in thread "main" Stopping Server 
    java.lang.NullPointerException 
at servers.MultiThreadedServer.stop(MultiThreadedServer.java:51) 
at servers.Dispatch.main(Dispatch.java:18) 

我做了這些文件

WorkerRunnable.java

package servers; 

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

/** 

*/ 
public class WorkerRunnable implements Runnable{ 

protected Socket clientSocket = null; 
protected String serverText = null; 

public WorkerRunnable(Socket clientSocket, String serverText) { 
    this.clientSocket = clientSocket; 
    this.serverText = serverText; 
} 

public void run() { 
    try { 
     InputStream input = clientSocket.getInputStream(); 
     OutputStream output = clientSocket.getOutputStream(); 
     long time = System.currentTimeMillis(); 
     output.write(("HTTP/1.1 200 OK\n\nWorkerRunnable: " + 
       this.serverText + " - " + 
       time + 
       "").getBytes()); 
     output.close(); 
     input.close(); 
     System.out.println("Request processed: " + time); 
    } catch (IOException e) { 
     //report exception somewhere. 
     e.printStackTrace(); 
    } 
    } 
} 

MultiThreadedServe r.java

package servers; 

import java.net.ServerSocket; 
import java.net.Socket; 
import java.io.IOException; 

public class MultiThreadedServer implements Runnable{ 

protected int   serverPort = 8080; 
protected ServerSocket serverSocket = null; 
protected boolean  isStopped = false; 
protected Thread  runningThread= null; 

public MultiThreadedServer(int port){ 
    this.serverPort = port; 
} 

public void run(){ 
    synchronized(this){ 
     this.runningThread = Thread.currentThread(); 
    } 
    openServerSocket(); 
    while(! isStopped()){ 
     Socket clientSocket = null; 
     try { 
      clientSocket = this.serverSocket.accept(); 
     } catch (IOException e) { 
      if(isStopped()) { 
       System.out.println("Server Stopped.") ; 
       return; 
      } 
      throw new RuntimeException(
       "Error accepting client connection", e); 
     } 
     new Thread(
      new WorkerRunnable(
       clientSocket, "Multithreaded Server") 
     ).start(); 
    } 
    System.out.println("Server Stopped.") ; 
} 


private synchronized boolean isStopped() { 
    return this.isStopped; 
} 

public synchronized void stop(){ 
    this.isStopped = true; 
    try { 
     this.serverSocket.close(); 
    } catch (IOException e) { 
     throw new RuntimeException("Error closing server", e); 
    } 
} 

private void openServerSocket() { 
    try { 
     this.serverSocket = new ServerSocket(this.serverPort); 
    } catch (IOException e) { 
     throw new RuntimeException("Cannot open port 8080", e); 
    } 
} 

} 

Dispatch.java

package servers; 

public class Dispatch { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    MultiThreadedServer server = new MultiThreadedServer(9000); 
    new Thread(server).start(); 

    try { 
     Thread.sleep(20 * 1000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("Stopping Server"); 
    server.stop(); 

} 

} 
+0

檢查是否有另一個進程正在偵聽端口8080(如果是這樣,請停止該進程並再試一次)。如果您在Linux中,請嘗試「netstat -antp」。 – Switch 2012-04-02 03:38:22

+0

對於HTTP,\ n \ n應該是\ r \ n。 – EJP 2012-04-02 04:23:18

回答

2

你的機器的端口8080被其他程序

終止使用端口8080

程序您可以通過以下命令(Windows)中找出程序:

netstat -o -n -a | findstr 0.0:8080 

例輸出:

TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 8704 

然後您可以使用任務管理器找到使用PID 8704的程序並終止它。

詳情請參閱here

使用其他端口

可以更改

protected int serverPort = 8080; 

protected int serverPort = 8888; 

或者

MultiThreadedServer server = new MultiThreadedServer(8888); 

所以它使用端口8888而不是8080

+0

在過去的幾周裏,我使用了很多Java。但我從來沒有寫過一個服務器/客戶端應用程序。如果我無法訪問服務器,我將如何在家測試這種類型的應用程序。 – 2014-02-10 18:43:43

3

這有可能是端口8080已經被另一個服務在您的計算機(它通常使用的web服務器,像Tomcat) 。嘗試在另一個端口號中啓動服務器。

2

您的代碼容易出錯,誤導您。您將服務器端口指定爲9000,並在異常塊中將其打印爲8080,並在類聲明中將其初始化爲8080。使用的真正端口是端口9000,而不是8080。嘗試另一個端口 - 試試8080

相關問題