Java套接字程序挂在sc.nextInt();

时间:2018-07-16 02:08:16

标签: java sockets

我正在使用以下代码来学习Java套接字编程。它的作用是,client.java程序从用户那里获取一个数字并将其发送到sever.java。然后,服务器会将其乘以2,然后将其发送回客户端。在我的客户端程序中,它成功将用户输入发送到服务器,但是服务器挂在number=sc.nextInt();行上等待。但是,如果我关闭client.java程序,则表明sever.java程序确实收到了客户端发送的内容,并以正确的结果终止了该程序。

client.java

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

public class client {
    public static void main(String args[]) throws IOException
    {
        int number, temp;
        Scanner sc = new Scanner (System.in);
        Socket s = new Socket ("127.0.0.1",6666);
        Scanner sc1 = new Scanner (s.getInputStream());
        System.out.println("Enter any number");
        number = sc.nextInt();

        PrintStream p = new PrintStream(s.getOutputStream());
        p.print(number);//passing the number to the sever
        System.out.println("after passing the number");//Never reach here

        temp=sc1.nextInt();
        System.out.println(temp);                   
    }    
}

Sever.java

import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class sever {
    public static void main(String args[]) throws IOException
    {
        System.out.println("sever starting");
        int number, temp;
        ServerSocket s1=new ServerSocket(6666);
        Socket ss=s1.accept();
        Scanner sc=new Scanner(ss.getInputStream());
        number=sc.nextInt();  //Program waits here unless I close the client        
        System.out.println("this part never get executed: "+number);

        temp = number*2;//doesn't reach here till I close the client program
        System.out.println("Result temp: "+temp);
        PrintStream p=new PrintStream(ss.getOutputStream());
        p.print(temp);  
    }    
}

1 个答案:

答案 0 :(得分:1)

客户端发送的输入号码没有任何终止符,例如42。服务器上的Scanner可以看到42,但不知道这是否是完整的数字,因此它一直等到关闭连接或收到空白为止。

通过在客户端上使用println即可轻松解决。

您可能还需要flush的数据,例如suggested by Vince Emigh

  

在打印数据后,通过调用PrintStream#flushchange the constructor arguments to auto-flush刷新输出。

您可能也想在服务器上使用printlnflush,但是由于服务器退出并因此关闭了连接,因此无论如何客户端都将完成sc1.nextInt()调用。