同一个java程序在mac和win下运行结果不同?
用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循环没能退出?请问如何解决?