代码之家  ›  专栏  ›  技术社区  ›  user7094359

为什么这段代码只在带有断点的调试模式下工作?(IDE调试器)

  •  0
  • user7094359  · 技术社区  · 7 年前

    代码:

    主要:

    package LiteDoor;
    
    import java.io.File;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.ArrayList;
    
    import LiteDoor.net.AcceptTelnetClient;
    
    public class Main {
    
        public static final String VERSION = "v0.0.1"; 
    
        public static File scripts = new File("scripts");
    
        public static ArrayList<AcceptTelnetClient> conns = new ArrayList<AcceptTelnetClient>();
    
        public static void main(String args[]) throws Exception
        {
            File autorun = new File(scripts.getAbsolutePath()+File.separatorChar+"autorun.litescript");
            if (!autorun.exists()) {
                scripts.mkdirs();
                autorun.createNewFile();
            }
    
            ServerSocket Soc=new ServerSocket(666);
            while(true)
            {
                Socket CSoc=Soc.accept();
                AcceptTelnetClient ob=new AcceptTelnetClient(CSoc);
            }
        }
    
    }
    

    AcceptTelnetClient:

    package LiteDoor.net;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.Socket;
    
    import LiteDoor.Main;
    import LiteDoor.io.MyBufferedWriter;
    
    public class AcceptTelnetClient extends Thread {
        Socket ClientSocket;
        public boolean master;
        public String slaveCmd = null;
    
        public AcceptTelnetClient(Socket CSoc) throws Exception {
            Main.conns.add(this);
    
            ClientSocket=CSoc;
            System.out.println("Client Connected ...");
            BufferedReader in  = new BufferedReader(new InputStreamReader(ClientSocket.getInputStream()));
            @SuppressWarnings("resource")
            MyBufferedWriter out = new MyBufferedWriter(new OutputStreamWriter(ClientSocket.getOutputStream()));  
    
            out.writeln("MASTER/SLAVE?");
    
            switch(in.readLine().toUpperCase()) {
            case("MASTER"):
                master = true;
                break;
            case("SLAVE"):
                master = false;
                break;
            }
    
            int i=0;
            while(i<200) {
                out.newLine();
                i++;
            }
            out.flush();
    
            start();        
        }
    
        public void run() {
            try {    
                BufferedReader in=new BufferedReader(new InputStreamReader(ClientSocket.getInputStream()));
                @SuppressWarnings("resource")
                MyBufferedWriter out = new MyBufferedWriter(new OutputStreamWriter(ClientSocket.getOutputStream()));  
    
                out.writeln("");
    
                if (!master) {
                    BufferedReader fr = new BufferedReader(new FileReader(Main.scripts.getAbsolutePath()+File.separatorChar+"autorun.litescript"));
                    String line = fr.readLine();
                    while(line != null) {
                        if (!line.startsWith("#") && line != "") {
                            out.writeln(line);
                        }
                        line = fr.readLine();
                    }
                    fr.close();
                }
    
                boolean loop = true;
    
                while(loop) {
                    if (master) {
                        String cmd = in.readLine();
                        if(cmd.startsWith("quit")) {
    
                            loop=false;
    
                        } else {  
                            System.out.println("Master says: " + cmd);
                            for (AcceptTelnetClient con : Main.conns) {
                                if (!con.master) {
                                    synchronized (con) {
                                        con.slaveCmd = cmd;
                                    }
                                }
                            }
                        }
                    } else {
                        if (slaveCmd != null) {
                            synchronized (this) { // Here needs to be an breakpoint
                                out.writeln(slaveCmd);
                                slaveCmd = null;
                            }
                        }
                    }
                }
                ClientSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    ClientSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } 
    }
    

    客户端1连接到“从属”中的服务器类型

    客户端2连接“master”中的类型并发送一些命令

    发生了什么: 客户端1作为从属连接 客户端2连接时,主服务器发送一个命令,但从服务器没有收到该命令(它不会显示在telnet客户端窗口中)

    PS是的,我试过谷歌,但什么也没找到

    1 回复  |  直到 7 年前
        1
  •  1
  •   ΦXocę 웃 Пepeúpa ツ    7 年前

    TL;博士。。。

     public volatile boolean master;