Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX和Sockets:聊天室故障,有时有效_Java_Sockets_Javafx_Server_Client - Fatal编程技术网

JavaFX和Sockets:聊天室故障,有时有效

JavaFX和Sockets:聊天室故障,有时有效,java,sockets,javafx,server,client,Java,Sockets,Javafx,Server,Client,我有一个服务器、客户机和主菜单类,它们一起使用套接字创建聊天室,但并不总是有效。这很容易出错。有时它会通过所有客户端发送消息,有时它只发送到本地客户端。有时,它只发布两次用户名,而不是发布消息和用户名 我认为服务器类是坏的,或者套接字都传递了错误的信息,但我不确定。任何修复的帮助都会很好。谢谢 public class Server{ //Var's That User Inputs private static String IP; public static String MESSAGE;

我有一个服务器、客户机和主菜单类,它们一起使用套接字创建聊天室,但并不总是有效。这很容易出错。有时它会通过所有客户端发送消息,有时它只发送到本地客户端。有时,它只发布两次用户名,而不是发布消息和用户名

我认为服务器类是坏的,或者套接字都传递了错误的信息,但我不确定。任何修复的帮助都会很好。谢谢

public class Server{

//Var's That User Inputs
private static String IP;
public static String MESSAGE;

//Hard-Coded Var's
public static int MaxUsers = 12;

private static ServerSocket serverSocket;
private static int PORT = 25570;
private static PrintWriter out;
private static BufferedReader in;
public static Socket socket;

public static void main(String args[]) throws IOException{

    System.out.println("Starting Server...");

    try {//Gets Server IP
        InetAddress iAddress = InetAddress.getLocalHost();
        IP = iAddress.getHostAddress();
        System.out.println("Server IP address : "+IP);
        System.out.println("Server Port: "+PORT);
    } catch (UnknownHostException e) {
        System.out.println("Exceptioni "+e);
        System.exit(-1);
    }
    //Starting Server Socket
    serverSocket = new ServerSocket(PORT);
    System.out.println("Server Started.");

    while(true){

    socket = serverSocket.accept();
    System.out.println("Client Accepted."); 

    for(int i = 0;i < MaxUsers; i++){

    System.out.println("IP Connection from: "+socket.getInetAddress());
    out = new PrintWriter(socket.getOutputStream(), true);
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

    if(Users.user[i]==null){
        Users.user[i] = new Users(out,in,Users.user);
    Thread thread = new Thread(Users.user[i]);
    thread.start();
    break;  
            }

        }

    }

}

public static String getServerIP(){
    try {
        InetAddress iAddress = InetAddress.getLocalHost();
        IP = iAddress.getHostAddress();   
    } catch (UnknownHostException e) {

    }
    return IP;
}

}

class Users implements Runnable{
String MESSAGE;
PrintWriter out;
BufferedReader in;
static Users[] user = new Users[Server.MaxUsers];
String name;

public Users(PrintWriter out, BufferedReader in, Users[] user){
    this.out = out;
    this.in = in;
    this.user = user;
}

public void run(){
    try {
        name = in.readLine();
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    while(true){
        try {
            MESSAGE = in.readLine();

        for(int i=0;i<Server.MaxUsers;i++){
            if(user[i] != null){
                    user[i].out.println(name+": "+MESSAGE);
                } 
            }
        } catch(IOException e){
            this.out = null;
            this.in = null;
        }
    }
}
}
主菜单类,这是运行客户端所需的

public class MainMenu extends Application {

static DataInputStream in;
static String IP;
static String MessageFromPlayer;
static String name;

@Override
public void start(Stage primaryStage) {

    Pane p1 = new Pane();//Applicatino>Stage>Scene>Pane;
    Pane p2 = new Pane();
    Pane p3 = new Pane();
    Pane p4 = new Pane();

    Label l1 = new Label("IP: ");
    Label l2 = new Label("Chat: ");
    Label l3 = new Label("UserName: ");
    TextField t1 = new TextField();
    TextField t2 = new TextField();
    TextField t3 = new TextField();
    TextArea a1 = new TextArea();
    a1.setEditable(false);

    Scene s1 = new Scene(p1,960, 540);
    Scene s2 = new Scene(p2,960, 540);
    Scene s3 = new Scene(p3,960, 540);
    Scene s4 = new Scene(p4,960, 540);
    Button b1 = new Button("SinglePlayer");
    Button b2 = new Button("MultiPlayer");
    Button b3 = new Button("Connect");
    Button b4 = new Button("Enter");

    p1.getChildren().add(b1);
    p1.getChildren().add(b2);

    p2.getChildren().add(l1);
    p2.getChildren().add(l3);
    p2.getChildren().add(t1);
    p2.getChildren().add(t3);
    p2.getChildren().add(b3);

    p3.getChildren().add(l2);
    p3.getChildren().add(t2);
    p3.getChildren().add(a1);
    p3.getChildren().add(b4);

    //Item Layout
    b1.setLayoutX(380);//TODO: Fix layout, division by max size
    b1.setLayoutY(270);

    b2.setLayoutX(560);
    b2.setLayoutY(270);

    l1.setLayoutX(438);
    l1.setLayoutY(270);

    l2.setLayoutX(100);
    l2.setLayoutY(485);

    t1.setLayoutX(455);
    t1.setLayoutY(270);

    t2.setLayoutX(100);
    t2.setLayoutY(500);

    b3.setLayoutX(455);
    b3.setLayoutY(300);

    a1.setLayoutX(100);
    a1.setLayoutY(100);

    b4.setLayoutX(250);
    b4.setLayoutY(500);

    l3.setLayoutX(395);
    l3.setLayoutY(230);

    t3.setLayoutX(455);
    t3.setLayoutY(230);

    //Button Listeners
    b1.setOnAction(new EventHandler<ActionEvent>(){
            public void handle(ActionEvent event){
                System.out.println("Single Player Starting...");
                primaryStage.hide();
                engineTester.MainGameLoop.main(null);   
        }
    });
    b2.setOnAction(new EventHandler<ActionEvent>(){
        public void handle(ActionEvent event){
            System.out.println("Multi Player Starting...");
            primaryStage.setScene(s2);

    }
});
    b3.setOnAction(new EventHandler<ActionEvent>(){
        public void handle(ActionEvent event){
            try {
                name = t3.getText();
                IP = t1.getText();
                Client.Connect();
                if(Client.Connected == true){
                    primaryStage.setScene(s3);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    }
});
    b4.setOnAction(new EventHandler<ActionEvent>(){
        public void handle(ActionEvent event){

            MessageFromPlayer = t2.getText();

                try {
                    Client.main();

                } catch (IOException e) {
                    e.printStackTrace();
                }
            a1.insertText(0, ChatBox.getServerMessage()+"\n");
            t2.clear();
    }
});

    primaryStage.setScene(s1);
    primaryStage.setResizable(false);
    primaryStage.show();
}

public static void main(String[] args) {
    System.out.println("Client Starting.");
    launch(args);

}
}
public类主菜单扩展应用程序{
静态数据输入流;
静态字符串IP;
静态字符串播放器;
静态字符串名;
@凌驾
公共无效开始(阶段primaryStage){
窗格p1=新建窗格();//应用程序编号>舞台>场景>窗格;
窗格p2=新窗格();
窗格p3=新窗格();
窗格p4=新窗格();
标签l1=新标签(“IP:”);
标签l2=新标签(“聊天室”);
标签l3=新标签(“用户名:”);
TextField t1=新的TextField();
TextField t2=新的TextField();
TextField t3=新的TextField();
TextArea a1=新TextArea();
a1.可编辑设置(假);
场景s1=新场景(p1960540);
场景s2=新场景(P2960540);
场景s3=新场景(p3960540);
场景s4=新场景(p4960540);
按钮b1=新按钮(“单人播放器”);
按钮b2=新按钮(“多人游戏”);
按钮b3=新按钮(“连接”);
按钮b4=新按钮(“输入”);
p1.getChildren().add(b1);
p1.getChildren().add(b2);
p2.getChildren().add(l1);
p2.getChildren().add(l3);
p2.getChildren().add(t1);
p2.getChildren().add(t3);
p2.getChildren().add(b3);
p3.getChildren().add(l2);
p3.getChildren().add(t2);
p3.getChildren().add(a1);
p3.getChildren().add(b4);
//项目布局
b1.setLayoutX(380);//TODO:固定布局,按最大大小划分
b1.setLayoutY(270);
b2.setLayoutX(560);
b2.setLayoutY(270);
l1.setLayoutX(438);
l1.设置布局(270);
l2.设置布局X(100);
l2.设置布局(485);
t1.setLayoutX(455);
t1.setLayoutY(270);
t2.setLayoutX(100);
t2.setLayoutY(500);
b3.setLayoutX(455);
b3.设置布局(300);
a1.设置布局X(100);
a1.设置布局(100);
b4.setLayoutX(250);
b4.设置布局(500);
l3.setLayoutX(395);
l3.设置布局(230);
t3.setLayoutX(455);
t3.setLayoutY(230);
//按钮侦听器
b1.setOnAction(新的EventHandler(){
公共无效句柄(ActionEvent事件){
System.out.println(“单人启动…”);
primaryStage.hide();
engineTester.MainGameLoop.main(空);
}
});
b2.setOnAction(新的EventHandler(){
公共无效句柄(ActionEvent事件){
System.out.println(“多玩家启动…”);
初生阶段:西新统(s2);
}
});
b3.setOnAction(新的EventHandler(){
公共无效句柄(ActionEvent事件){
试一试{
name=t3.getText();
IP=t1.getText();
Client.Connect();
if(Client.Connected==true){
初生阶段.第三纪(s3);
}
}捕获(例外e){
e、 printStackTrace();
}
}
});
b4.setOnAction(新的EventHandler(){
公共无效句柄(ActionEvent事件){
MessageFromPlayer=t2.getText();
试一试{
Client.main();
}捕获(IOE异常){
e、 printStackTrace();
}
a1.insertText(0,ChatBox.getServerMessage()+“\n”);
t2.clear();
}
});
初生阶段:西新统(s1);
primaryStage.SetResizeable(假);
primaryStage.show();
}
公共静态void main(字符串[]args){
System.out.println(“客户端启动”);
发射(args);
}
}

您是否遇到任何异常情况?您知道代码的哪一部分导致了问题吗?你提供了太多的代码…我没有得到一个例外,很抱歉。我相信服务器出故障了。当多个客户端连接到它时,服务器无法区分消息和名称,我不知道为什么
public class MainMenu extends Application {

static DataInputStream in;
static String IP;
static String MessageFromPlayer;
static String name;

@Override
public void start(Stage primaryStage) {

    Pane p1 = new Pane();//Applicatino>Stage>Scene>Pane;
    Pane p2 = new Pane();
    Pane p3 = new Pane();
    Pane p4 = new Pane();

    Label l1 = new Label("IP: ");
    Label l2 = new Label("Chat: ");
    Label l3 = new Label("UserName: ");
    TextField t1 = new TextField();
    TextField t2 = new TextField();
    TextField t3 = new TextField();
    TextArea a1 = new TextArea();
    a1.setEditable(false);

    Scene s1 = new Scene(p1,960, 540);
    Scene s2 = new Scene(p2,960, 540);
    Scene s3 = new Scene(p3,960, 540);
    Scene s4 = new Scene(p4,960, 540);
    Button b1 = new Button("SinglePlayer");
    Button b2 = new Button("MultiPlayer");
    Button b3 = new Button("Connect");
    Button b4 = new Button("Enter");

    p1.getChildren().add(b1);
    p1.getChildren().add(b2);

    p2.getChildren().add(l1);
    p2.getChildren().add(l3);
    p2.getChildren().add(t1);
    p2.getChildren().add(t3);
    p2.getChildren().add(b3);

    p3.getChildren().add(l2);
    p3.getChildren().add(t2);
    p3.getChildren().add(a1);
    p3.getChildren().add(b4);

    //Item Layout
    b1.setLayoutX(380);//TODO: Fix layout, division by max size
    b1.setLayoutY(270);

    b2.setLayoutX(560);
    b2.setLayoutY(270);

    l1.setLayoutX(438);
    l1.setLayoutY(270);

    l2.setLayoutX(100);
    l2.setLayoutY(485);

    t1.setLayoutX(455);
    t1.setLayoutY(270);

    t2.setLayoutX(100);
    t2.setLayoutY(500);

    b3.setLayoutX(455);
    b3.setLayoutY(300);

    a1.setLayoutX(100);
    a1.setLayoutY(100);

    b4.setLayoutX(250);
    b4.setLayoutY(500);

    l3.setLayoutX(395);
    l3.setLayoutY(230);

    t3.setLayoutX(455);
    t3.setLayoutY(230);

    //Button Listeners
    b1.setOnAction(new EventHandler<ActionEvent>(){
            public void handle(ActionEvent event){
                System.out.println("Single Player Starting...");
                primaryStage.hide();
                engineTester.MainGameLoop.main(null);   
        }
    });
    b2.setOnAction(new EventHandler<ActionEvent>(){
        public void handle(ActionEvent event){
            System.out.println("Multi Player Starting...");
            primaryStage.setScene(s2);

    }
});
    b3.setOnAction(new EventHandler<ActionEvent>(){
        public void handle(ActionEvent event){
            try {
                name = t3.getText();
                IP = t1.getText();
                Client.Connect();
                if(Client.Connected == true){
                    primaryStage.setScene(s3);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    }
});
    b4.setOnAction(new EventHandler<ActionEvent>(){
        public void handle(ActionEvent event){

            MessageFromPlayer = t2.getText();

                try {
                    Client.main();

                } catch (IOException e) {
                    e.printStackTrace();
                }
            a1.insertText(0, ChatBox.getServerMessage()+"\n");
            t2.clear();
    }
});

    primaryStage.setScene(s1);
    primaryStage.setResizable(false);
    primaryStage.show();
}

public static void main(String[] args) {
    System.out.println("Client Starting.");
    launch(args);

}
}