单例网络对象在第二次调用时出错
Singleton networking object gives error on second call
将创建哪个单例对象的通信class:
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@%s\n", 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;
}
}
}
另一个 class 将重复使用单例对象:
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() 方法发现单例仍然设置(因为您没有在登录结束时设置单例 null)并且 returns 你是死对象。
然后扫描器尝试在关闭的套接字输入流上读取 Int。我想那是行不通的。
将创建哪个单例对象的通信class:
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@%s\n", 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;
}
}
}
另一个 class 将重复使用单例对象:
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() 方法发现单例仍然设置(因为您没有在登录结束时设置单例 null)并且 returns 你是死对象。
然后扫描器尝试在关闭的套接字输入流上读取 Int。我想那是行不通的。