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);
}
}