Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:具有IP黑名单的客户机-服务器简单应用程序_Java_Sockets_Networking_Client Server_Java Io - Fatal编程技术网

Java:具有IP黑名单的客户机-服务器简单应用程序

Java:具有IP黑名单的客户机-服务器简单应用程序,java,sockets,networking,client-server,java-io,Java,Sockets,Networking,Client Server,Java Io,我正在用简单的java(java.net*和java.io*)编写一个客户机-服务器应用程序,该应用程序具有多线程功能,可以实现多个客户机到服务器的连接。我还试图在一个文本文件中实现一个简单的IP黑名单,当有人连接到服务器套接字时可以访问该黑名单,如果有IP,则关闭连接,如果没有IP,则让客户端线程启动 黑名单适用于那些需要被列入黑名单的IP以及那些它甚至不会启动线程的IP 这里的问题是未列入黑名单的IP,即使它们启动新线程并建立连接,也无法到达应用程序的输入部分: 服务器: S

我正在用简单的java(
java.net*
java.io*
)编写一个客户机-服务器应用程序,该应用程序具有多线程功能,可以实现多个客户机到服务器的连接。我还试图在一个文本文件中实现一个简单的IP黑名单,当有人连接到服务器套接字时可以访问该黑名单,如果有IP,则关闭连接,如果没有IP,则让客户端线程启动

黑名单适用于那些需要被列入黑名单的IP以及那些它甚至不会启动线程的IP

这里的问题是未列入黑名单的IP,即使它们启动新线程并建立连接,也无法到达应用程序的输入部分:

服务器:

        ServerSocket server = new ServerSocket(6500);
    System.out.println ("server started on port 6500");     
    while (true){//waiting for clients
        Socket socket = null;
        BufferedReader reader = new BufferedReader(new FileReader("C:\\UNIV\\Redes\\workspace\\Copy of Ex_4.3_Teste\\lists\\blacklist.txt"));
        String line = null;
        socket = server.accept();

        // BlackList Verification
        while ((line = reader.readLine()) != null) {
            if (line.equals(socket.getInetAddress().toString())) {
                System.out.println("IP Blacklisted: " + socket.getInetAddress().toString());
                System.out.println("Terminating connection with " + socket.getInetAddress().toString());
                PrintStream checkBlack = new PrintStream(socket.getOutputStream(),true);
                checkBlack.println("***BLACKLISTED***");
                reader.close();
                socket.close();
                break; 
            }
        }//end of blacklist verification

        userList.add(socket.getInetAddress().toString());
        System.out.println("new connection...");
        System.out.println("Size of UserList: " + userList.size());
        Thread t = new Thread(new EchoClientThread(socket)); 

        t.start();
客户:

public static void main(String args[]) throws Exception {
    if (args.length !=1){
        System.err.println ("usage: java EchoClient2 <host>");
        System.exit(1);
    }               
    String host = args[0];
    int port = 6500;
    String cmd, line;
    Socket socket = new Socket(host,port);
    BufferedReader input = new BufferedReader(
            new InputStreamReader(socket.getInputStream()));
    PrintStream output = new PrintStream(socket.getOutputStream(),true);

        while( true ) {//begin cycle

            Scanner scan = new Scanner (System.in);

            System.out.println("Begin Cycle");//For debugging

            if (input.readLine().equals("***BLACKLISTED***")) {
                System.out.println("IP is Blacklisted");
                break;
            }

            System.out.println("Continue Cycle");//For debugging

            System.out.println(" ");
            System.out.println("CLIENT MENU");
            System.out.println(" ");
            System.out.println("1 - List on-line users");
            System.out.println("2 - Send message to single user");
            System.out.println("3 - Send message to all users");
            System.out.println("4 - Show Whitelist");
            System.out.println("5 - Show Blacklist");
            System.out.println("9 - Exit");
            System.out.println(" ");
            System.out.print(host+":"+port+"#>"); //Command line            
            cmd = scan.nextLine();// Read command to send   
            output.println(cmd); //Send command to the server

            if ( cmd.equalsIgnoreCase("quit")){
                System.out.println("exiting..");
                break;//Exit the cycle
            }           
            while (!(line = input.readLine()).equals("***CLOSE***")) {//Input cycle                         
            System.out.println (line);//Prints server answer        
            }

        }//End of cycle

    System.out.println("Connection Terminated");
    input.close();//Close input
    output.close();//Close output
    socket.close();//Close socket   
}
}
publicstaticvoidmain(字符串args[])引发异常{
如果(args.length!=1){
System.err.println(“用法:JavaEchoClient2”);
系统出口(1);
}               
字符串host=args[0];
int端口=6500;
字符串cmd,行;
套接字=新的套接字(主机、端口);
BufferedReader输入=新BufferedReader(
新的InputStreamReader(socket.getInputStream());
PrintStream输出=新的PrintStream(socket.getOutputStream(),true);
while(true){//开始循环
扫描仪扫描=新扫描仪(System.in);
System.out.println(“开始循环”);//用于调试
if(input.readLine()等于(“***被列入黑名单***”){
System.out.println(“IP被列入黑名单”);
打破
}
System.out.println(“继续循环”);//用于调试
System.out.println(“”);
System.out.println(“客户端菜单”);
System.out.println(“”);
System.out.println(“1-列出在线用户”);
System.out.println(“2-向单个用户发送消息”);
System.out.println(“3-向所有用户发送消息”);
System.out.println(“4-显示白名单”);
System.out.println(“5-显示黑名单”);
System.out.println(“9-退出”);
System.out.println(“”);
System.out.print(主机+“:“+端口+”#>”;//命令行
cmd=scan.nextLine();//读取要发送的命令
output.println(cmd);//向服务器发送命令
if(cmd.equalsIgnoreCase(“退出”)){
System.out.println(“退出…”);
break;//退出循环
}           
而(!(line=input.readLine()).equals(“***关闭***”){//input循环
System.out.println(行);//打印服务器应答
}
}//周期结束
System.out.println(“连接终止”);
input.close();//关闭输入
output.close();//关闭输出
socket.close();//关闭套接字
}
}
因此,列入黑名单的IP没有到达
t.start()
,而未列入黑名单的IP则成功地启动了一个新线程。没问题

问题出在客户端,一个未列入黑名单的IP,开始循环并打印
System.out.println(“开始循环”)但它从未到达
System.out.println(“继续循环”)

readLine
正在阻塞,它等待一个完整的行。这在任何情况下都会执行。只有在黑名单客户的情况下,您才向客户写信:

checkBlack.println("***BLACKLISTED***"); // Server

但是如果是一个被认可的客户,你不会发送任何反馈。最简单的解决办法是只发送一条批准消息。

谢谢,这条消息确实不存在。
checkBlack.println("***BLACKLISTED***"); // Server