当前位置: 技术问答>java相关
服务器连结的问题,请高手指点。
来源: 互联网 发布时间:2015-01-16
本文导语: 当我第一次传递值true给startflag时,服务器建立端口,当我第二次传递false值给startflag时,提示java.lang.NullPointerException的错误,当我第三次递值true给startflag时,提示java.net.BindException: Address in use: bind,说明第二次没...
当我第一次传递值true给startflag时,服务器建立端口,当我第二次传递false值给startflag时,提示java.lang.NullPointerException的错误,当我第三次递值true给startflag时,提示java.net.BindException: Address in use: bind,说明第二次没有将端口关闭,为什么,怎么关?请大虾指点一二。
class ServerSocketPort extends Thread
{
public ServerSocketPort(int p,boolean startflag)
{ port=p;
StartFlag=startflag;
}
public void run()
{ int i=1;
try
{
if (StartFlag)
{
s=new ServerSocket(port);
Socket incoming = s.accept();
//add handle
i++;
}
else
{
s.close();
}
sleep(5);
}
catch(Exception e)
{ System.out.println(e);
}
}
private int port;
private boolean StartFlag;
private ServerSocket s;
}
class ServerSocketPort extends Thread
{
public ServerSocketPort(int p,boolean startflag)
{ port=p;
StartFlag=startflag;
}
public void run()
{ int i=1;
try
{
if (StartFlag)
{
s=new ServerSocket(port);
Socket incoming = s.accept();
//add handle
i++;
}
else
{
s.close();
}
sleep(5);
}
catch(Exception e)
{ System.out.println(e);
}
}
private int port;
private boolean StartFlag;
private ServerSocket s;
}
|
因为你在构造器里传参数,而没有别的方法传参,也就是你每次都创建新的对象。
你第二次应该是new ServerSocketPort(port ,false);这样就重新创建了一个对象,而不是使用原来的(第一次创建的对象),所以ServerSocket s为空。
第三次new ServerSocketPort(port,true);一样重新创建对象,若port和原先创建的一样,也就是原先的ServerSocket没有关闭,出现你那样的错误。
解决方法如下:
使用一个对象,
ServerSocketPort ssp = new ServerSocketPort();
ssp.set(1024,true);
ssp.set(2048,false);
ssp.set(1024,false);
.......
class ServerSocketPort extends Thread
{
public void set(int p,boolean startflag)
{
port=p;
StartFlag=startflag;
}
public void run()
{
int i=1;
while(true)
{
try
{
if (StartFlag)
{
if(ht!=null && !ht.contains(""+port))
{
s=new ServerSocket(port);
Socket incoming = s.accept();
ht.put(""+port,s);
//add handle
i++;
}
}
else
{
if(ht!=null && ht.contains(""+port))
{
s = (ServerSocket)ht.get(""+port);
s.close();
}
}
sleep(5);
}
catch(Exception e)
{
System.out.println(e);
}
}
}
private Hashtable ht = new Hashtable();
private int port;
private boolean StartFlag;
private ServerSocket s;
}
你第二次应该是new ServerSocketPort(port ,false);这样就重新创建了一个对象,而不是使用原来的(第一次创建的对象),所以ServerSocket s为空。
第三次new ServerSocketPort(port,true);一样重新创建对象,若port和原先创建的一样,也就是原先的ServerSocket没有关闭,出现你那样的错误。
解决方法如下:
使用一个对象,
ServerSocketPort ssp = new ServerSocketPort();
ssp.set(1024,true);
ssp.set(2048,false);
ssp.set(1024,false);
.......
class ServerSocketPort extends Thread
{
public void set(int p,boolean startflag)
{
port=p;
StartFlag=startflag;
}
public void run()
{
int i=1;
while(true)
{
try
{
if (StartFlag)
{
if(ht!=null && !ht.contains(""+port))
{
s=new ServerSocket(port);
Socket incoming = s.accept();
ht.put(""+port,s);
//add handle
i++;
}
}
else
{
if(ht!=null && ht.contains(""+port))
{
s = (ServerSocket)ht.get(""+port);
s.close();
}
}
sleep(5);
}
catch(Exception e)
{
System.out.println(e);
}
}
}
private Hashtable ht = new Hashtable();
private int port;
private boolean StartFlag;
private ServerSocket s;
}
|
还少了ht.remove()方法:
class ServerSocketPort extends Thread
{
public void set(int p,boolean startflag)
{
port=p;
StartFlag=startflag;
}
public void run()
{
int i=1;
while(true)
{
try
{
if (StartFlag)
{
if(ht!=null && !ht.contains(""+port))
{
s=new ServerSocket(port);
Socket incoming = s.accept();
ht.put(""+port,s);
//add handle
i++;
}
}
else
{
if(ht!=null && ht.contains(""+port))
{
s = (ServerSocket)ht.get(""+port);
s.close();
ht.remove(""+port);
}
}
sleep(5);
}
catch(Exception e)
{
System.out.println(e);
}
}
}
private Hashtable ht = new Hashtable();
private int port;
private boolean StartFlag;
private ServerSocket s;
}
class ServerSocketPort extends Thread
{
public void set(int p,boolean startflag)
{
port=p;
StartFlag=startflag;
}
public void run()
{
int i=1;
while(true)
{
try
{
if (StartFlag)
{
if(ht!=null && !ht.contains(""+port))
{
s=new ServerSocket(port);
Socket incoming = s.accept();
ht.put(""+port,s);
//add handle
i++;
}
}
else
{
if(ht!=null && ht.contains(""+port))
{
s = (ServerSocket)ht.get(""+port);
s.close();
ht.remove(""+port);
}
}
sleep(5);
}
catch(Exception e)
{
System.out.println(e);
}
}
}
private Hashtable ht = new Hashtable();
private int port;
private boolean StartFlag;
private ServerSocket s;
}