Singleton网络对象在第二次调用时出错



将创建其单例对象的通信类:

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。我想这是行不通的。

最新更新