gpt4 book ai didi

Java TCP 客户端在 Eclipse 之外工作时无响应

转载 作者:行者123 更新时间:2023-12-01 10:47:04 24 4
gpt4 key购买 nike

当连接到本地 TCP 服务器时,我无法让客户端 Java 应用程序做出响应。服务器显示客户端已连接,但客户端没有收到来自服务器的更新并保持静态。然而,当我在 Eclipse 中运行两者时,它工作得很好。但是将每个导出到可执行 jar 文件后,我就没那么幸运了。我环顾四周,认为可能是我的 Windows 防火墙,我已将其禁用,但它仍然不起作用。

TCP 服务器在本地运行,客户端仅通过服务器计算机具有的任何本地 IP 地址进行连接。即使在同一台机器上(但在 Eclipse 之外)测试客户端和服务器,客户端仍然没有响应,但服务器显示它已连接客户端。我只是不知道 Eclipse 正在做什么来使应用程序的运行方式与外部运行方式不同。非常感谢任何建议!谢谢。

通信的设置方式是我们有一个主要的 JSON 对象,其中包含客户端接收的命令。根据命令,客户端会做出某种 react 。在服务器上,每个客户端都是一个独立的线程。当客户端首次连接时,服务器添加它们并创建一个新的 ServerClient,用于来回链接通信。加入后,服务器应将所有已连接的客户端回显给加入者,并将显示在客户端 GUI 中。还有更多涉及的内容,但这是基本的客户端-服务器通信链接。

服务器:

/**
* Constructs a new Server with a link to the ServerApp.
* @param app - Target ServerApp
*/
public Server(ServerApp app) {
this.app = app;
clients = new HashMap<>();
serverDir = new ServerDirector(this);
}

/**
* Main server loop. Waits and listens for new clients.
*/
public void run() {
while (running) {
try {
// wait and accept new clients
app.log("Waiting for client...");
addClient(serverSocket.accept());
} catch (SocketException e) { // terminate if socket is closed!
running = false;
} catch (EOFException e) {
running = false;
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

/**
* Opens server socket on defined PORT.
* @throws IOException
*/
public void open() throws IOException {
serverSocket = new ServerSocket(portNo);
}

/**
* Adds a client to the clients map.
* @param socket - Socket to allow server client to connect
* @throws IOException
*/
public void addClient(Socket socket) throws IOException {
if (clients.size() < MAX_CLIENTS) {
int ID = serverDir.getPlayers().size();
System.out.println("Socket: " + socket);
ServerClient sc = new ServerClient(ID, socket, this);
sc.open();
sc.start();
sc.echoID(); // echo ID to main client thread
NewJSONObject k = new NewJSONObject(ID, Keys.Commands.CONNECT); // send connection status!
k.put(Keys.CONNECT_STATUS, 1); // connection is good!
sc.getIOHandler().send(k);
clients.put(ID, sc);
} else {
System.out.println("Client limit reached. Client connection refused!");
}
}

客户:

    /**
* Constructs a client with link to main app, and specified ID and socket.
* @param app - ClientApp
* @param ID - ID to assign
* @param socket - Socket to connect to
*/
public Client(ClientApp app, int ID, Socket socket) {
this.app = app;
this.ID = ID;
this.socket = socket;
}

/**
* Starts this thread.
*/
public void start() {
running = true;
super.start();
}

/**
* Main thread loop. Listens to input received on InputStream.
*/
public void run() {
while (running) {
try {
ioHandler.receive((JSONObject)streamIn.readObject());
} catch (EOFException | SocketException e) {
running = false;
try {
terminate();
} catch (IOException e1) {
e1.printStackTrace();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}

/**
* Attempts to connect to the specified socket.
* @param socket - Socket to connect to.
* @throws IOException
*/
public void connect(Socket socket) throws IOException {
this.socket = socket;
open();
connected = true;
}

/**
* Opens I/O streams.
* @throws IOException
*/
public void open() throws IOException {
streamOut = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
streamOut.flush();
streamIn = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
}
  • ServerClient 扩展了 Client,因为它们共享许多相同的功能。虽然ServerClient有一个到服务器的链接,并且是客户端通过服务器与其他客户端进行通信的方式。

因此,一旦客户端连接,我就会有一个服务器 GUI,其中包含所有已连接客户端的列表。然后,ServerDirector(处理数据包)发送“addPlayer”命令,客户端解释 JSON 数据包中的指定名称并将其添加到 GUI。该名称出现在客户端上,然后一旦 2 个以上玩家加入,就会发送进一步的命令以在各种状态之间进行转换。 Eclipse 内一切正常,但一旦应用程序是外部 jar,客户端就会保持静态,即使服务器显示客户端确实已连接。在 Eclipse 外部运行时,客户端不会收到任何数据包更新。

最佳答案

我发现了这个问题。从 eclipse 导出时,应用程序使用的所有资源文件(例如播放器 Sprite )不在正确的目录中,这会导致多个 FileNotFoundException 和 NullPointerException 并导致客户端无法运行,因为其他组件依赖于 res 文件。只需将 res 文件夹添加到 jar 即可解决问题!

关于Java TCP 客户端在 Eclipse 之外工作时无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34113770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com