繁体   English   中英

Java Server Socket Socket程序读取时卡住

[英]Java Server Socket Socket program stuck while reading

我有 2 个程序,一个是服务器,另一个是客户端,我还有其他一些 class 代表几何形状。 在带有扫描仪的客户端中,用户以矩形为例编写形状宽度、长度的特征。 他创建一个 object 并将其发送到服务器,服务器接收 object 计算面积和周长并将它们发送给客户端。 这应该会发生,直到用户在客户端而不是特征中按下回车键。 而且我不知道为什么,但是第一个循环运行良好,但是第二个循环我输入了我的特征,然后什么也没有发生,我的程序被卡住了。 也许你可以在这里看到我的错误是 2 程序:

Ps:我是法国人,很抱歉我的变量名称服务器使用法语单词:

ServerSocket sockConn = null;
    Socket sockComm = null;
    try{
        sockConn = new ServerSocket();
        InetSocketAddress isa = new InetSocketAddress(portServ);//port + wildcard.
        sockConn.bind(isa);
        System.out.println("Server Launched !");
        int nbForme = 0;
        int compteur = 0;
        while(true){
            sockComm = sockConn.accept();
            ObjectInputStream is = new ObjectInputStream(sockComm.getInputStream());
            ObjectOutputStream os = new ObjectOutputStream(sockComm.getOutputStream());
            //nbForme = is.readInt();
            //System.out.println("nombre de forme a traiter recu : "+nbForme);              
            FormeGeo forme = (FormeGeo)is.readObject();
            
            System.out.println("Forme recu "+forme.toString());
            os.writeDouble(forme.perimetre());
            os.flush();
            os.writeDouble(forme.aire());
            os.flush();
            //compteur++;
            
            //System.out.println("Nombre de forme demande atteint");
            //is.close();
            //os.close();
             
        }

我的客户:

            String ipServ = args[0];
        sockComm = new Socket();
        InetSocketAddress connect= new InetSocketAddress(ipServ,portServ);
        sockComm.connect(connect);
        //          System.out.print("Entrez un nombre de forme a saisir : ");
        //sc = new Scanner(System.in);
        //nbForme = sc.nextInt();
        //sc = null;
        //System.out.println(nbForme);
        //System.out.println("Envoi du nombre de forme a traiter");

        //os.writeInt(nbForme);
        //os.flush();
        while(!line.equals("")){
            System.out.println("Saisissez les valeurs d'une forme ou appuyer sur entrer pour stopper le programme");
            sc = new Scanner(System.in);
            line = sc.nextLine();
            os = new ObjectOutputStream(sockComm.getOutputStream());
            is = new ObjectInputStream(sockComm.getInputStream());
            
            
            if(line.equals("")){
                System.out.println("Fin du programme");
                break;
            }else if(!line.contains(",")){
                rayon = Double.parseDouble(line);
                if(rayon<=0.0){
                    System.out.println("Longueur du rayon doit être positive");
                    System.exit(2);
                }   
                FormeGeo rond = new Rond(rayon);
                os.writeObject(rond);
            }else{
                String[] numbers = line.split(","); 
                if(numbers.length==2){
                    longueur = Double.parseDouble(numbers[1]);
                    largeur = Double.parseDouble(numbers[0]);
                    FormeGeo rec= new Rectangle(largeur,longueur);
                    os.writeObject(rec);
                }else{
                    System.out.println("Erreur trop d'arguments pour un rectangle !");
                    System.exit(3);
                }
            }
            os.flush();

            double perimetre = is.readDouble();
            double aire = is.readDouble();
            
            System.out.println("perimetre et  aire renvoye par le serveur respectivement : "+perimetre+" et "+aire);
            //compteur++;
            //is.close();
        }
        is.close();
        os.close();

您的服务器套接字执行以下操作:

  • 等待连接发生,然后接受它。 (这是sockConn.accept()
  • 接收来自该连接的请求
  • 向该连接发送响应
  • 等待连接发生,然后接受它。
  • 接收来自该连接的请求
  • 向该连接发送响应
  • ...

即您的服务器只期望每个连接一个请求。

您的客户这样做:

  • 连接到服务器
  • 发送请求
  • 收到回复
  • 发送请求
  • 收到回复
  • ...

当您的客户端等待第二个响应时,您的服务器正在等待第二个连接,所以什么也没有发生。

您可以通过执行以下操作之一来修复它:

  • 让客户端为每个请求启动一个新连接
  • 让服务器在同一个连接上处理多个请求(而不是等待一个新的请求)
  • 使服务器为每个连接启动一个新线程,这样它就可以同时处理多个连接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM