利用socket写聊天窗口,为什么有时候客户端输入好几次回车才能收到服务端或者其他客户发来的消息?

服务端代码如下:

package service;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
public class Server implements Runnable {
Socket socket;
public Server(Socket socket) {
this.socket = socket;
}
public void run() {
BufferedReader bufferedreade = null;
PrintWriter printwrite = null;
Hasdsadlist hasd = new Hasdsadlist();
try {
// 读取用户输入的用户名,
bufferedreade = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String name = bufferedreade.readLine();
printwrite = new PrintWriter(socket.getOutputStream()); // 发给客户
// 判断用户名是否重复
if (hasd.map.containsKey(name)) {
while (hasd.map.containsKey(name)) {
printwrite.println("用户名已存在,请重新输入用户名:");
printwrite.flush();
name = bufferedreade.readLine();
}
hasd.map.put(name, socket);
printwrite.println("欢迎登录"+name);
printwrite.flush();
} else {
printwrite.println("欢迎登录"+name);
printwrite.flush();
hasd.map.put(name, socket);
}
// 读取到的内容
String tem1;
while ((tem1 = bufferedreade.readLine()) != null) {
// 当接受到客户发端发的某个消息时,刷新列表显示所有的客户
if (tem1.equals("SX")) {
printwrite = new PrintWriter(socket.getOutputStream()); // 发给客户
for (Object key : hasd.map.keySet()) {
printwrite.println("所有的用户为:" + key);
printwrite.flush();
}
continue;
//判断输入的是否包含@
} else if(tem1.contains(Signal.signal)){
Socket values = hasd.map.get(tem1.substring(0, tem1.indexOf(Signal.signal))); // 通过key拿到value值
printwrite = new PrintWriter(values.getOutputStream());
printwrite.println("用户" + name + "发过来:" + (tem1.substring(tem1.indexOf(Signal.signal) + 1, tem1.length())));
printwrite.flush();
continue;
}else{
//如果不包含,发送给客户一句输入有误
printwrite.println("输入格式有误,请按照'用户+@+内容'格式输入");
printwrite.flush();
continue;
}

}

} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedreade.close();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}
}

客户端代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

import service.Hasdsadlist;

public class Clir2main {
public static void main(String[] args) {
Socket socket = null;
PrintWriter printwrite = null;
BufferedReader bufferedreade = null;
try {
socket = new Socket("127.0.0.1", 300);
bufferedreade = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 用户登录
Scanner sc = new Scanner(System.in);
System.out.println("输入用户名:");
String name = sc.next();
// 用户名写入到服务器
printwrite = new PrintWriter(socket.getOutputStream());
printwrite.println(name);
printwrite.flush();
// 用户读取服务器发来的判断用户名的内容
String temp;
while ((temp = bufferedreade.readLine()) != null) {
if (temp.contains("欢迎")) { // 说明用户名不重复 contains
System.out.println(temp); //直接打印,然后登录
break;
} else {
System.out.println(temp);
name = sc.next();
printwrite.println(name);
printwrite.flush();
}
}
// 用户的对话写到服务器
while (true) {
Clir1 cilr = new Clir1(socket);
Thread thred = new Thread(cilr);
thred.start(); //开启了写入服务端的线程
String temp1 = bufferedreade.readLine();
System.out.println(temp1);

while(true){ //while的作用,不会发送给其他用户
//如果读到输入有误,就直接打印出来,停止循环
if(temp1.contains("输入有误")){
System.out.println(temp1);
}
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

客户端 线程:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class Clir1 implements Runnable {
PrintWriter printwrite = null;
BufferedReader bufferedreade = null;
private Socket socket;
public Clir1(Socket socket) {
this.socket = socket;
}
public void run() {
try {
Scanner sc = new Scanner(System.in);
printwrite = new PrintWriter(socket.getOutputStream());
while (true) {
String tem1 = sc.next();
printwrite.println(tem1);
printwrite.flush();

}
} catch (IOException e) {
e.printStackTrace();
}
}

}

猜你喜欢

转载自www.cnblogs.com/wangsq/p/9750995.html