【问题标题】:Client doesn't process commands sent from server. Java客户端不处理从服务器发送的命令。爪哇
【发布时间】:2017-04-29 14:29:56
【问题描述】:

我的客户端不处理从服务器发送的命令,但我的服务器可以处理客户端发送的命令。 如果我在调试中运行我的客户端,则线程“in”正在等待输入字符串并执行命令。
我减少了我的代码以便于阅读。

服务器:

public class Server extends Thread{

    BufferedReader in;
    PrintWriter out;
    ServerSocket server;
    Socket client = null;
    Frame frame;

Server() throws IOException{
    frame = new Frame();
    try {
        server = new ServerSocket(4444);
        frame.textAreaForServer.append("Welcome to server side!\n");
    } catch (IOException e) {
        frame.textAreaForServer.append("Couldn't listen to port 4444\n");
        System.exit(-1);
    }
    addListenerOnTextField();
    this.start();
}

private void clearVector(){
    frame.textAreaForServer.append("-clr\n");
    try {
        //send message for client
        out.println("-clr");
        frame.textAreaForServer.append("Vector is cleared\n");
    } catch (NullPointerException e1) {
        frame.textAreaForServer.append("It's impossible to perform!\n");
    }
}

public void run(){
    while (true) {
        try {
             //connection to client
            if (client == null) {
                frame.textAreaForServer.append("Waiting for client connection...\n");
                client = server.accept();
                in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                out = new PrintWriter(client.getOutputStream(), true);
                frame.textAreaForServer.append("Client connected\n");              
            }
        } catch (IOException e) {
            frame.textAreaForServer.append("Can't accept\n");
            System.exit(-1);
        }            
    }
}

客户:

public class Client extends Thread{

    Socket fromserver = null;
    BufferedReader in = null;
    PrintWriter out;
    ControlPanel controlPanel;

    Client(ControlPanel controlPanel1) throws IOException {
        controlPanel = controlPanel1;
        addListenerOnTextField();
        this.start();
    }

    //connection to server
    private void connect(ControlPanel controlPanel) {
        controlPanel.textAreaForClient.append("-ct\n");
        if (fromserver == null) {
            controlPanel.textAreaForClient.append("Connecting to localhost...\n");
            try {
                fromserver = new Socket("localhost", 4444);
                in = new BufferedReader(new InputStreamReader(fromserver.getInputStream()));
                out = new PrintWriter(fromserver.getOutputStream(), true);
            } catch (IOException e1) {
                controlPanel.textAreaForClient.append("Server is not available!\n");
            }
        } else {
            controlPanel.textAreaForClient.append("Already connected\n");
        }
    }

    public void run() {
    while (true) {
        //here the -clr command sent from server should be proceeded, but it doesn't
        try {
            switch (in.readLine()) {
                case "-clr": {
                    VectorOfThreads.getInstance().getVectorOfThreads().removeAllElements();
                    controlPanel.textAreaForClient.append("Vector is cleared\n");
                    break;
                }
            }
        } catch (IOException e) {
           e.printStackTrace();
        }
    }
}

}

【问题讨论】:

    标签: java client-server


    【解决方案1】:

    似乎在客户端类中您在读取任何输入流之前忘记连接到服务器。此外,在服务器线程中创建输出流后,您没有调用 ClearVector。

    我已经根据您的代码实现了一个非常基本的服务器/客户端程序。它工作正常:

    服务器类:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import jdk.internal.org.objectweb.asm.tree.analysis.Frame;
    
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    /**
     *
     * @author Emad
     */
    public class Server extends Thread {
    
        BufferedReader in;
        PrintWriter out;
        ServerSocket server;
        Socket client = null;
        Frame frame;
    
        Server() throws IOException {
            try {
                server = new ServerSocket(4444);
                System.out.println("Welcome to server side. listening on port 4444");
            } catch (IOException e) {
                System.out.println("Couldn't listen to port 4444\\n");
                System.exit(-1);
            }
            this.start();
        }
    
        private void clearVector() {
            System.out.println(" -clr command send\n");
            try {
                //send message for client
                out.println("-clr");
                System.out.println("Vector is cleared\n");
            } catch (NullPointerException e1) {
                System.out.println("It's impossible to perform\n");
            }
        }
    
        public void run() {
            while (true) {
                try {
                    //connection to client
                    if (client == null) {
                        System.out.println("Waiting for client connection...\\n");
                        client = server.accept();
                        in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                        out = new PrintWriter(client.getOutputStream(), true);
                        clearVector();
                        System.out.println("Client Connected!");
                    }
                } catch (IOException e) {
                    System.out.println("Can't accept.\n");
                    System.exit(-1);
                }
            }
        }
    
        public static void main(String args[])
        {
            try {
                Server serverInstance = new Server();
            } catch (IOException ex) {
                System.out.println("Exception");
                Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    

    客户端类:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    /**
     *
     * @author Emad
     */
    public class Client extends Thread {
    
        Socket fromserver = null;
        BufferedReader in = null;
        PrintWriter out;
    
        Client() throws IOException {
            this.start();
        }
    
        //connection to server
        private void connect() {
            System.out.println("-ct\n");
            if (fromserver == null) {
                System.out.println("Connecting to localhost...\n");
                try {
                    fromserver = new Socket("localhost", 4444);
                    in = new BufferedReader(new InputStreamReader(fromserver.getInputStream()));
                    out = new PrintWriter(fromserver.getOutputStream(), true);
                } catch (IOException e1) {
                    System.out.println("Server is not available!\n");
                }
            } else {
                System.out.println("Already connected\n");
            }
        }
    
        public void run() {
            connect();
            while (true) {
                //here the -clr command sent from server should be proceeded, but it doesn't
                try {
                    switch (in.readLine()) {
                        case "-clr": {
                            System.out.println("Vector is cleared\n");
                            break;
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        public static void main(String args[])
        {
            try {
                Client clientInstance = new Client();
            } catch (IOException ex) {
                System.out.println("Error in instanciating client");
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多