我正在使用以下代码来学习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);
}
}
答案 0 :(得分:1)
客户端发送的输入号码没有任何终止符,例如42
。服务器上的Scanner
可以看到42
,但不知道这是否是完整的数字,因此它一直等到关闭连接或收到空白为止。
通过在客户端上使用println
即可轻松解决。
您可能还需要flush
的数据,例如suggested by Vince Emigh:
在打印数据后,通过调用
PrintStream#flush
或change the constructor arguments to auto-flush刷新输出。
您可能也想在服务器上使用println
和flush
,但是由于服务器退出并因此关闭了连接,因此无论如何客户端都将完成sc1.nextInt()
调用。