java - 发送到多线程客户端-服务器中的所有客户端
问题描述
我的代码目前有问题。客户端应该能够发送字符串“messge# somestring ”,如果服务器注意到它包含“message#”子字符串,它应该将其发送给所有用户。但是,正在发生的事情是它只发送给一个发送了我正在尝试实现的“伪请求”的用户。以下是我的代码供参考:
import java.io.*;
import java.net.*;
import java.util.Vector;
public class server {
static ServerSocket ss;
static Socket s;
static DataInputStream dis;
static DataOutputStream dos;
static Integer maxNumofUsers=4;
static Vector<UserHandler> users;
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Integer currNumofUsers=0;
ss=new ServerSocket(7777);
users=new Vector<UserHandler>();
while(currNumofUsers<maxNumofUsers) {
s=ss.accept();
UserHandler uh= new UserHandler(s, "Player "+Integer.toString(currNumofUsers+1));
users.add(uh);
users.get(users.size()-1).start();//start a thread
currNumofUsers++;
for(int i=0; i<users.size(); i++) {//updates number of users present pero userhandler
users.get(i).updateUserSet(users);
}
}
System.out.println("Maximum number of players reached.");
}
}
class UserHandler extends Thread{
Socket s;
DataInputStream dis;
DataOutputStream dos;
Vector<UserHandler> users=new Vector<UserHandler>();
String username;
public UserHandler(Socket s, String username) {
// TODO Auto-generated constructor stub
this.s=s;
this.username=username;
}
public void run(){
try {
dis=new DataInputStream(s.getInputStream());
dos=new DataOutputStream(s.getOutputStream());
while(true) {
String message=dis.readUTF();
if(message.contentEquals("exit")) {
dos.writeUTF("exit granted");
close();
break;
}else if(message.contains("message#")){//group sms
for(int i=0; i<users.size(); i++) {
users.get(i).dos.writeUTF("henlo");
System.out.println("Wrote to "+users.get(i).username);
}
}else {
dos.writeUTF("Some String");
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
try {
s.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}
}
public void close() {
try {
for(int i=0; i<users.size(); i++) {
if(users.get(i).username==this.username) {
users.remove(i);
System.out.println("out");
for(int j=0; j<users.size(); j++) {
users.get(j).updateUserSet(users);
}
break;
}
}
dis.close();
dos.close();
s.close();
}catch(IOException e) {
e.printStackTrace();
}
}
public void updateUserSet(Vector<UserHandler> users) {
// TODO Auto-generated method stub
this.users=users;
}
}
对于服务器。对于客户,
import java.net.*;
import java.util.Scanner;
import java.io.*;
public class client {
static Socket s;
static DataInputStream dis;
static DataOutputStream dos;
static gameWindow GUI;
static String username;
public static void main(String[] args) throws Exception {
try {
s=new Socket();
s.connect(new InetSocketAddress("127.0.0.1",7777), 5000);
System.out.println("Socket "+s.getInetAddress()+" has connected.");
username= JOptionPane.showInputDialog("Please input username: ");
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("Cannot connect to server. Either the Server was not established or maximum number of players was reached.");
}
if(s.isConnected()){
try {
dis=new DataInputStream(s.getInputStream());
dos=new DataOutputStream(s.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Scanner sc=new Scanner(System.in);
String msg;
while(true) {
msg=sc.nextLine();
dos.writeUTF(msg);
String rcv=dis.readUTF();
if (rcv.contentEquals("exit granted")) {
System.out.println("Socket "+s.getInetAddress()+" is closed.");
close();
break;
}else if(rcv.contains("array#")) {
String tobearr=rcv;
String[] arred=tobearr.split("#");
for(int i=0; i<arred.length; i++) {
System.out.println(arred[i]);
}
tobearr="";
}else if(rcv.contains("message#")) {
String grpsms=rcv.substring(8, rcv.length());
System.out.println(grpsms);
}
System.out.println(rcv);
rcv="";
}
}
}
private static void close() {
// TODO Auto-generated method stub
try {
dis.close();
dos.close();
s.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
解决方案
推荐阅读
- linux - 在 Linux 中创建一个给定大小的文件并用用户数据模式填充它
- elasticsearch - Elasticsearch 中范围查询的奇怪行为
- azure - ADF 限制:一个管道中的 COPY 数据活动数量?
- botframework - Bot Framework 技能 - 无需身份验证即可调试
- postgresql - 如何在 PostgreSQL 中使用单个查询将两条相关记录插入两个不同的表中?
- .net - .NET Core BackgroundService 只运行一次
- matlab - 如何在 MATLAB 中将 3D 坐标 (x,y,z) 转换为 .STL 文件?
- python - SyntaxError: f-string: 期待 '}'
- html - Visualforce:仅当值不为空时才呈现抛出异常
- reactjs - 如何在反应引导模态中的模态内容的div上添加类