java - Java 套接字程序在 sc.nextInt() 处挂起;
问题描述
我正在使用以下代码来学习 Java 套接字编程。它的作用是,client.java 程序从用户那里获取一个数字并将其发送到 sever.java。然后服务器将其乘以 2 并将其发送回客户端。在我的客户端程序中,它成功地将用户输入发送到服务器,但服务器挂在number=sc.nextInt();
等待线上。但是如果我关闭 client.java 程序,它会显示 sever.java 程序确实收到了客户端发送的内容并以正确的结果终止程序。
客户端.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);
}
}
服务器.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);
}
}
解决方案
客户端正在发送没有任何终止符的输入号码,例如42
。服务器上的Scanner
看到42
但不知道这是否是完整的数字,因此它一直等到连接关闭或收到空格。
通过println
在客户端上使用轻松修复。
正如Vince Emigh 所建议的,您可能还需要flush
数据:
PrintStream#flush
通过在打印数据后调用来刷新输出,或者将构造函数参数更改为 auto-flush。
您可能也想在服务器上使用println
and flush
,但由于服务器退出并因此关闭连接,客户端将sc1.nextInt()
无论如何都会完成调用。
推荐阅读
- macos - MacOS Mojave 上的 VS 代码
- c++ - Win32:如何访问 Windows Listview 标题控件过滤器
- raspberry-pi3 - buildroot uboot saveenv 到 emmc fat 分区
- php - 字符串到数组的转换 [PHP]
- git - 如何使用命令查看 GitLab 中所有打开的合并请求?
- c - 将 unsigned char 数组复制到 uint32_t,反之亦然
- android - Flutter中如何实现Socket IO客户端数据
- plc - How to set the PC/PG interface in Step7?
- scada - 如何使用wincc在sql server中插入当前日期和时间
- r - R/Python - 三角公式的 For 循环语句