将创建其单例对象的通信类:
import java.net.*;
import java.io.*;
import java.util.Scanner;
public class Communication {
private static Communication mInstance = null;
private static final String REQUEST_LOGIN = "Login";
private BufferedOutputStream socketOutput = null;
private PrintWriter printOut = null;
private Socket socket = null;
private Scanner reader = null;
private Communication()
{
//connect to server using loopback address
try{
socket = new Socket("127.0.0.1", 4242);
//set inputs and out puts
socketOutput = new BufferedOutputStream(socket.getOutputStream());
printOut = new PrintWriter(socket.getOutputStream(), true);
reader = new Scanner(socket.getInputStream());
}
catch( UnknownHostException uhe){
uhe.printStackTrace();
}
catch( IOException ex){
ex.printStackTrace();
}
}
public static Communication getInstance(){
if(mInstance == null)
{
mInstance = new Communication();
}
return mInstance;
}
//sample method for requesting login
public boolean login(String u, String p){
try{
String username = u;
String password = p;
printOut.printf("%s!%s@%sn", REQUEST_LOGIN, username, password);
int loginStatus = reader.nextInt();
if (loginStatus == 1){
socketOutput.close();
socket.close();
return true;}
else{
socketOutput.close();
socket.close();
return false;
}
}
catch( IOException ex){
ex.printStackTrace();
return false;
}
}
}
另一个将重复使用singleton对象的类:
public class Go{
public static void main(String[] args) {
Communication.getInstance().login("user", "password");
Communication.getInstance().login("user", "password");
}
}
第一次呼叫正常,并进行身份验证。第二次调用调用错误:
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:907)
at java.util.Scanner.next(Scanner.java:1530)
at java.util.Scanner.nextInt(Scanner.java:2160)
at java.util.Scanner.nextInt(Scanner.java:2119)
at Communication.login(Communication.java:49)
at Go.main(Go.java:7)
如何重复使用该对象?
登录方法关闭套接字,在第二次调用时,扫描程序处理死输入流。应用程序流中的某些内容已损坏。
通信器是一个单例,您会破坏它,因为您会使其在登录方法中的所有资产失效。getInstance()方法查找仍设置的singleton(因为在登录结束时没有将singleton设置为null),并返回dead对象。
然后扫描程序尝试读取一个封闭套接字的输入流上的Int。我想这是行不通的。