同一个java程序在mac和win下运行结果不同?

sinat_38170563 2017-04-03 01:27:00
用java写的简单的聊天室,分为客户端和服务端,同样的代码,客户端输入"exit"退出后,在mac下服务端无限循环输出读到的数据null,而在win下则正常只输出一句客户端下线,这是为什么?

客户端代码:
public class ChatroomClient {
private Socket socket;
public ChatroomClient(){
}
public void start() throws IOException{
socket=new Socket("localhost",8088);
System.out.println("[客户端]:和服务器建立连接");
//客户端向服务器发送消息
//获得输出流
OutputStream os=socket.getOutputStream();
PrintWriter out=new PrintWriter(os);
Scanner sc=new Scanner(http://System.in);
while(true){
String data=sc.next();
if("exit".equals(data)){
out.println("exit");
break;
}
out.println(data);
out.flush();
}
}
public static void main(String[] args) throws IOException{
ChatroomClient client=new ChatroomClient();
client.start();
}
}

服务端代码:
public class ChatroomServer {
private ServerSocket server;
private SimpleDateFormat sdf;

public ChatroomServer() throws IOException {
try {
sdf = new SimpleDateFormat("HH:ss:MM");
server = new ServerSocket(8088);
System.out.println("[服务端]" + printTime() + ":服务器启动成功...");
} catch (IOException e) {
throw e;
}
}

public String printTime() {
return sdf.format(new Date());
}

public void start() throws IOException {
while (true) {
// 监听客户端的连接
try {
Socket socket = server.accept();
System.out.println("[服务端]:与客户端建立连接");
System.out.println("[服务端]:" + socket);
// 启动一个线程维护一个Socket对象
new ClientHandler(socket).start();
} catch (IOException e) {
throw e;
}
}
}

private class ClientHandler extends Thread {
private Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}

public void run() {
try {
//服务器接受客户端的消息 需要获得输入流
InputStream in = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
while (true) {
String datas = br.readLine();
if ("exit".equals(datas)) {
break;
}
System.out.println("[读取的数据]:" + datas + " [" + printTime() + "]");
}
} catch (IOException e) {
System.out.println("[服务端]:客户端下线" + "[" + printTime() + "]");
}
}
}

public static void main(String[] args) throws IOException {
ChatroomServer server = new ChatroomServer();
server.start();
}
}

运行结果:
客户端输入信息服务端可正常接收,但当客户端输入"exit"退出时,客户端退出,服务端则无限循环输出"[读取数据]:null"。Windows下则正常输出"[服务端]:客户端下线"。感觉是因为某些原因在mac的系统下服务端没能正确接收到"exit"导致while循环没能退出?请问如何解决?

...全文
317 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

51,410

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧