Java 服务器示例错误

标签 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();
    }
  }
 }

多线程服务器.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();

}

}

最佳答案

8080 端口可能已被您计算机中的其他服务使用(它通常由网络服务器使用,例如 Tomcat )。尝试在另一个端口号中启动您的服务器。

关于Java 服务器示例错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9970568/

相关文章:

java - 获取大于system.currentTimeMillis值的rand值的方法

java - Apache ftp.retrieveFileStream 返回 null

java - 为什么 Maven 会警告我有关编码的问题?

java - x 可能结果的概率

java - 从文件中读取二维数组-Java

java - 使用最大资源运行 jar 命令行

java - Spring Security 的域权限

java - 本例对HashMap哈希算法的解释

一段时间后使用 ProcessBuilder 启动的 Java 应用程序被阻止

java - 从 Eclipse 中的项目中删除 Apache TomCat 运行时?