【发布时间】:2020-01-01 22:38:11
【问题描述】:
我正在创建一个简单的套接字程序,它可以读取用户输入并将其存储在其变量中。它还允许向服务器发送消息。
客户端输入他们的详细信息(名称等),然后输入连接详细信息。我已经创建了发送这些变量的方法,但它们不能正常工作。
下面的预期结果:将客户端类中的playerName 存储到服务器类中的playerName。
实际结果:连接后的第一个输入存储到服务器的playerName变量中
//服务器客户端类
public static String playerName = "Client";
public static void playerDetails() {
Scanner playerInfo = new Scanner(System.in);
System.out.println("Welcome! Please Enter Your Player Name:");
playerName = playerInfo.nextLine();
}
public void sendNameToServer(String pName) throws IOException {
if (this.clientSocket == null || this.output == null)
throw new SocketException("Socket does not exist");
this.output.writeObject(playerName);
}
public void sendMessageToServer(String msg) throws IOException {
if (this.clientSocket == null || this.output == null)
throw new SocketException("socket does not exist");
this.output.writeObject(msg);
}
public void runClient() {
try {
BufferedReader fromConsole = new BufferedReader(new InputStreamReader(System.in));
String message = null;
while (true) {
message = fromConsole.readLine();
handleUserInput(message);
if(message.equals("over"))
break;
}
// server client Manager Class
try {
this.out = new ObjectOutputStream(this.clientSocket.getOutputStream());
this.in = new ObjectInputStream(this.clientSocket.getInputStream());
}
String pName = null;
String msg = "";
//Name
pName = (String)this.in.readObject();
this.server.sendNameToServer(pName, this);
msg = (String)this.in.readObject();
this.server.handleMessagesFromClient(msg, this);
//Abstract Methods
public abstract class ServerAbstractComponents {
public abstract void handleMessagesFromClient(String msg, ServerClientManager clientmgr);
public abstract void sendMessageToClient(String msg, ServerClientManager clientmgr);
public abstract void sendNameToServer(String pName, ServerClientManager clientmgr);
//Server Class
public String playerName;
public synchronized void sendNameToServer(String pName, ServerClientManager client) {
playerName = pName;
}
public synchronized void handleMessagesFromClient(String msg, ServerClientManager client) {
// format the client message before displaying in server's terminal output.
String formattedMessage = String.format("[client %d] : %s", client.getClientID(), msg);
if(msg.equals(new String("test"))) {
System.out.println("your name is:" + playerName);
} else
display(formattedMessage);
}
【问题讨论】:
-
您发布了太多代码,无法通过 - 请参阅 MCVE 并相应地编辑您的问题。然而,我的猜测是问题是
playerName是static。尝试从playerName(方法和变量)中删除static关键字。 -
您好,我已尝试删除 static 关键字,但在实例化类时遇到问题,我已尝试创建类的实例以使程序运行。
ServerClient myClient = new ServerClient(); myClient.playerDetails();但是我现在无法引用 main 中的非静态方法 -
我没有看到任何使用的 ServerSocket 或 Socket 实例。