【问题标题】:Server-Client what is wrong here?Server-Client 这里有什么问题?
【发布时间】:2016-03-13 18:18:27
【问题描述】:

所以这是我尝试“设置”的第一个服务器客户端,但它不能按我的意愿工作。这是我想要的:

客户端要做的事情:(见客户端代码中的cmets)

  1. 客户端应读取“用户输入”
  2. 将“用户输入”发送到服务器
  3. 从服务器接收回一些东西

要做的服务器:(参见代码中的cmets for Server)

  1. 接收客户端读取的“用户输入”
  2. 使用“用户输入”做某事
  3. 将 (2) 中完成的内容发送回客户端。

它不起作用,它唯一正确的做法是它接收来自“用户”的输入,就是这样:

public class Cli {

    BufferedReader in;
    PrintWriter out;
    Socket s; 
    public Cli(int port){
        try {
            s = new Socket("127.0.0.1", port);
            out = new PrintWriter(s.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader
                    (s.getInputStream()));
        } catch (UnknownHostException e) {
            System.out.print("fel");
        } catch (IOException e) {
            System.out.print("fel");
        }
    } 

    public void startaClient(){
            BufferedReader stdIn = new BufferedReader (new InputStreamReader(System.in));

        try {
            while(true){
                String userInput = stdIn.readLine();// get the user input (1)
                System.out.print("from user: " + userInput);
                out.write(userInput); // sends to server (2)
                System.out.println(in.readLine()); // receive from server(3)
            }
        } catch (Exception e){
            System.out.println("fel1");
        } 
    }

    public static void main(String[] args){
        Cli c=new Cli(4002);
        c.startaClient();
    }

这是服务器的代码:

public class Ser {
    ServerSocket s;

    public Ser()throws  Exception{
        s = new ServerSocket(4002);
    }

    public void startaServern()throws Exception {
        while (true) {
            Socket socket = s.accept(); //waits for new clients, acceptera inkommande förfrågan
            Trad t = new Trad(socket);
            t.start();
        }
    }

    public static void main(String[] args)throws Exception{
        Ser b = new Ser();
        b.startaServern();
    }
}

public class Trad extends Thread {
    Socket socket;
    BufferedReader in;
    PrintWriter out;

    public Trad(Socket s){
        socket=s;
        try{
            in = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 
            out=new PrintWriter(socket.getOutputStream(),true); 
        }catch(Exception e){System.out.println("fel");}
    }


    public void run(){
        while(true){
            try{
                String theInput  = in.readLine(); //read, receive message from client (1)
                String res  =  theInput+"blabla";    // do something with the message from the client (2)
                out.write(res); // send it back to the client (3)

            } catch(Exception e) {
                System.out.println("fel1");
            }
        }
    }
}

【问题讨论】:

    标签: java multithreading server client


    【解决方案1】:

    当您执行readLine() 时,它将读取一行,即直到它到达新行。

    除非您发送一条新线路,否则它将永远等待。我建议您发送一个换行符,以便读者知道该行已结束。

    由于您使用的是PrintWriter,因此最简单的解决方案是使用

    out.println(res);
    

    而不是out.write(res);

    【讨论】:

    • 用户应该向客户端发送一行文本
    • 您仍然可以按照 Peter Lawrey 的建议使用“out.println(res)”向客户端发送一行文本
    • 对不起,我一开始没明白。您的意思是,如果我使用,当服务器将发送回客户端时:out.write(res) 那么它不会发送该行,而只会写入输出流。相反,out.println(res) 将写入输出流并发送它? @Ravindrababu,无论如何问题仍然存在,没有真正发生
    • 服务器和客户端都改为println
    • @Ravindrababu 好的,我做到了,它似乎有效。但我仍然不知道有什么不同,out.write(res) 与 out.println(res)。你能简单解释一下有什么区别吗
    猜你喜欢
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 2011-01-22
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多