日期:2014-05-18  浏览次数:20721 次

实例化一个类调用它的方法和不实利化一个类调用它的方法到底有何不同?
ME——初学者,问题可能很肤浅,但是希望得到指点

今天写代码,功能很简单,实例化一个serversocket类,监听某个端口,来响应HTTP请求;

代码如下:

package com.exe;

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

public class WebServer {

public static final int http_port=8080;
private ServerSocket serversocket;

public void serverStart(int port){
try {
//serversocket=; 
System.out.println("web server start on:"+port);

while(true){
Socket socket=new ServerSocket(port).accept();
new Processor(socket).start();
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static void main(String[] args) {
if(args.length==1){
new WebServer().serverStart(Integer.parseInt(args[0]));
}
  new WebServer().serverStart(WebServer.http_port);

}

}

注意红色的部分我采用的方法是直接调用构造方法ServerSocket(int),然后调用了accept()方法,而没有通过实例化一个ServerSocket类来干,结果报错了
CONSOLE 提示如下:

java.net.BindException: Address already in use: JVM_Bind
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(Unknown Source)
at java.net.ServerSocket.bind(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at com.exe.WebServer.serverStart(WebServer.java:18)——也就是上面显示红色的那行
at com.exe.WebServer.main(WebServer.java:32)

于是我稍作修改,修改后如下:通过实例化一个ServerSocket类,然后再调用它的accept()方法,就通过了!

public class WebServer {

public static final int http_port=8080;
private ServerSocket serversocket;

public void serverStart(int port){
try {
serversocket=new ServerSocket(port); 
System.out.println("web server start on:"+port);

while(true){
Socket socket=serversocket.accept();
new Processor(socket).start();
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static void main(String[] args) {
if(args.length==1){
new WebServer().serverStart(Integer.parseInt(args[0]));
}
  new WebServer().serverStart(WebServer.http_port);

}

}

我太奇怪了,我一直以为这两句是同样的效果,而且前一句还少用一个变量,为什么?这是为什么?如果您知道,但是因为时间有限不能详细说清楚,请至少告诉我关键字,我好在网上找相关资料,因为我现在一点头绪都没有,不知道如何理解这个问题。

------解决方案--------------------
不是吧!这两个没什么区别啊...效果应该是一样的!
我觉的你掉用的时候一开始8080端口是在的,第2次正好你关了tomcat然后测试的时候就通过了
你换个端口试下 >_<