【问题标题】:Java multi-threading client serverJava多线程客户端服务器
【发布时间】:2013-01-29 20:03:34
【问题描述】:

我遇到了一些问题,试图用java做一个客户端/服务器系统,下一段代码属于客户端...

public class ClientTCP {

    final static int PORT = 65001;

    Socket _socket;

    private void fireUp(){

        String message = "";

        BufferedReader bfi = null;
        BufferedReader bfr = null;
        PrintWriter writer = null; 

        try{

            InetAddress address = InetAddress.getByName("localhost");

            _socket = new Socket(address,PUERTO);

            bfr = new BufferedReader(
                            new InputStreamReader(System.in));

            bfi = new BufferedReader(
                            new InputStreamReader(_socket.getInputStream()));

            System.out.println("Enter some data");

            String inputstr = bfr.readLine();

            writer = new PrintWriter(_socket.getOutputStream(),true);

            writer.println(inputstr);

            if((message = bfi.readLine()) != null){

                Logger.getLogger(ClientTCP.class.getName()).log(Level.INFO,message);
            }
        }catch(IOException ioex){

            ioex.printStackTrace();
        }finally{

            if(_socket != null){

                try {

                    _socket.close();
                } catch (IOException e) {

                    e.printStackTrace();
                }
            }
        }
    }

...而这个属于服务器,为每个客户端创建的线程:

public class ServerrTCP {

    static int SEC = 0;

    final static int PORT = 65001;

    Socket _socket;
    ServerSocket _ssocket;

    private void fireUp(){

        try{

            _socket = new Socket();
            _ssocket = new ServerSocket(PORT);

            while(true){

                _socket = _ssocket.accept();

                new ClientThreads(_socket,SEC++);
            }

        }catch(IOException ioex){

            Logger.getLogger(ServerTCP.class.getName()).log(Level.SEVERE,null,ioex);
        }

线程创建类...

public class ClientThreads extends Thread{

    int _id;
    Socket _socket;


    public ClientThreads(Socket socket, int id){

        super();

        _socket = socket;
        _id = id;

        this.start();
    }

    @Override
    public void run(){

        String strinput;

        BufferedReader bfr = null;
        PrintWriter writer = null;

        try{

            bfr = new BufferedReader(
                    new InputStreamReader(_socket.getInputStream()));

            writer = new PrintWriter(
                    _socket.getOutputStream(),true);

            while((strinput = bfr.readLine()) != null){

                System.out.println("The user "+ _id +" wrote "+ strinput);
            }

            writer.println("Thanks, user " + _id);
        }catch(IOException ioex){

            ioex.printStackTrace();
        }
    }
}

很抱歉代码量太大,但我因为这个问题而发疯了,我认为我出错的地方是粗体字,我认为它在阻止 I 时会产生某种问题/O,但我不知道为什么,以及如何解决它,提前谢谢

【问题讨论】:

  • 没有HilosServer的源代码,是不是在它的构造函数中启动了,是不是线程?
  • 我没有看到任何粗体代码。你的错误是什么?
  • 为什么要在服务器中初始化 Socket 成员?为什么它完全是服务器类的成员?它应该是接受循环中的局部变量。

标签: java sockets stream serversocket


【解决方案1】:

客户端正在等待服务器发送一些文本行。您的服务器不发送任何内容,因此它会一直等待。

我建议您让服务器向客户端发送一些内容以供其读取。

【讨论】:

  • 在 ClientThreads 中,行 writer.println("Thanks, user " + _id);据说是向客户端发送一些数据
  • 仅在来自客户端的流完成后,即已关闭。尝试在循环内移动它。
【解决方案2】:

问题出在 ClientThreads 的这一行中:

while((strinput = bfr.readLine()) != null){

          System.out.println("The user "+ _id +" wrote "+ strinput);
}

我只需要在循环的末尾添加一个break,否则,总是会要求一些代码,换句话说,它永远不会阻塞I/O

【讨论】:

    猜你喜欢
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2011-04-28
    相关资源
    最近更新 更多