HuaFool 2020-12-16 22:50 采纳率: 0%
浏览 659

Java-socket 如何解决客户端只能发送一次消息,而最后一个创建的客户端却能发送多次消息

如图所示,客户端111,客户端222,客户端333各发一次aaa,bbb,ccc之后,无论客户端111,222如何输入文字,都无法显示出来,但是客户端333可以一直发送文字,于是在客户端333中不断输入自己的名字发送出去,所有客户端都能接收到客户端333发出来的333名字,但是文字内容前的名字有部分不是333自己的,而是客户端111,或者客户端222的,求解

//这是服务器端处理消息的代码
public class serverReadAndPrint extends Thread{
	Socket newsocket ;
	String userName;
	static BufferedReader br;
	public serverReadAndPrint(Socket socket,String name) {
		this.newsocket = socket;
		this.userName = name;
	}
	public void run() {
		try {
			// 获取客户端信息,并把信息发送到客户端
			br = new BufferedReader(new InputStreamReader(newsocket.getInputStream()));
			while(true) {
				String str =  br.readLine();
				System.out.println("收到消息");
				//while ((str = br.readLine()) != null) {
					//检验是否私聊,格式:@名字:内容
				if (str.startsWith("@")) {
					System.out.println("发送给某人");
					System.out.println("@格式正确");
					int index = str.indexOf(":");
					System.out.println(":格式正确");
					if (index >= 0) {
						// 获取名字
						String name = str.substring(1, index);
						// 获取信息
						String massage = str.substring(index + 1, str.length());
						String smassage = userName + " 对你说: " + massage;
						if (Server.userNameList.contains(name)) {
							Socket s = Server.storeInfo.get(name);
							PrintWriter pw1 = new PrintWriter(s.getOutputStream());
							pw1.println(smassage);
							pw1.flush();
							PrintWriter pw2 = new PrintWriter(newsocket.getOutputStream());
							pw2.println("(我)" + userName + " 对  " + name + " 说: " + massage);
							pw2.flush();
						}
					}
				} else {
					// 发送给所有客户端
					System.out.println("------------");
					System.out.println("发送给所有人");
					for (Socket socket : Server.list) {
						PrintWriter pw = new PrintWriter(socket.getOutputStream());
						if (socket == newsocket) {
							pw.println("(我)" + userName + " 说: " + str);
						} else {
							pw.println(userName + " 说: " + str);
						}
						pw.flush();
					}
				}
			}
			//}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			//关闭相应套接字
			Server.list.remove(newsocket);
			//删除当前套接字用户名的名字
			Server.userNameList.remove(userName);
		}
		
	}
}

//这是客户端处理消息的代码

	public class clientReadAndPrint extends Thread {
		static Socket socket;
		static BufferedReader br;
		Client client;
		public clientReadAndPrint(Socket mySocket) {
			clientReadAndPrint.socket = mySocket;
		}

		// 用于接受服务器端发来的消息
	public void run() {
		try {
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			while (true) {
				// while ((str = br.readLine())!=null) {
				String str = br.readLine();
				// 将得到的信息投影到ta上
				Client.ta.append(str + '\n');
				// 设置滚动条在最下面
				Client.ta.setCaretPosition(Client.ta.getDocument().getLength());
				// }
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	}
  • 写回答

4条回答 默认 最新

  • HuaFool 2020-12-17 09:49
    关注

    感谢网友,找到错误点在哪了,我服务器端处理客户端信息的线程处将BufferedReader设置为静态变量,导致服务器端只能接收最后一个客户端的信息

    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料