1

我正在尝试用 java 创建一个客户端/服务器程序。

当客户端连接到服务器时,服务器将向他显示一条消息以输入第一个值当用户写入第一个值时服务器向他发送一条消息以写入 sencd 值当用户写入第二个值时服务器将向他显示操作列表 ans 等到客户端写入操作编号,然后服务器将向他发送此操作的结果。

当我编写程序代码并运行服务器然后运行客户端时,它不会做任何事情,服务器被阻止做任何事情,客户端也是如此。

这是我尝试过的代码:

对于客户:

import java.net.*;
import java.util.Scanner;
import java.io.*;


public class Client {

    final static String ADRSS = "localhost";
    final static int PORT = 1234;
     static Socket s = null;

    public static void main(String[] args) {

        try{


                Scanner cn = new Scanner(System.in);
                s = new Socket(ADRSS, PORT);
                PrintWriter out = new PrintWriter(s.getOutputStream());
                BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
                in.readLine();
            out.println(cn.nextLine());
            out.flush();
            in.readLine();
            out.println(cn.nextLine());
            out.flush();
            in.readLine();
            out.println(cn.nextLine());
            out.flush();

            System.out.println("Res = " + in.readLine());
            out.flush();

        }
        catch(IOException e){e.printStackTrace();

        }


    }

}

对于服务器:

  import java.net.*;
import java.io.*;

public class Server {


    final static int PORT = 1234;
    private static ServerSocket server;

    public static void main(String[] args) {
        Socket s = null;
        try {
        server = new ServerSocket(PORT);
        s = server.accept();
        PrintWriter out = new PrintWriter(s.getOutputStream());
        BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
        out.println("Donner le premier nombre : ");
        out.flush();
        double n1 = Double.parseDouble(in.readLine());
        out.println("Donner le deuxiéme nombre : ");
        out.flush();
        double n2 = Double.parseDouble(in.readLine());

        out.println("Donner l'op : ");
        out.flush();

        String choix = in.readLine();
        String res = null;

        switch(choix){

            case "1" :
                res = String.valueOf(n1 + n2);
                break;
            case "2" : 
                res = String.valueOf(n1 - n2);
                break;
            case "3" :
                res = String.valueOf(n1 * n2);
                break;
            case "4" :
                res = (n2 == 0) ? "Impossible d'éfectuer l'op" : String.valueOf(n1 / n2);
                break;
            default :
                res = "erreur";
            }

        out.println(res);
        out.flush();

        }catch(IOException e) {
            e.printStackTrace();
        }finally{
            try{
                s.close();
            }catch(IOException e){e.printStackTrace();}
        }

    }

}
4

2 回答 2

1

PrintWriter使用常规后不会刷新输出print(请参阅PrintWriter 的文档)。你必须手动冲洗它。但是,真正的原因是您的客户等待换行符,这永远不会发生。更改为out.println在服务器端应该可以运行,也包括冲洗。

于 2013-04-19T21:42:29.410 回答
0

首先,在服务器中的每次打印之后,添加

out.flush();

其次,您要求 nextLine() 但不打印 \n ,要么将 \n 添加到每个字符串的末尾,要么使用 out.println

于 2013-04-19T21:44:34.037 回答