java - Java 对象流到 libGDX 项目
问题描述
我确实尝试在 Java 中测试一些关于客户端/服务器通信的东西,因为我想构建一个具有客户端/服务器架构的游戏。
所以我阅读了一些文章等等......直到我尝试在 libGDX 项目客户端中使用相同的类和方法,而另一个作为服务器仍然是原始 java 项目之前,这一切都有效。
比有趣的开始,当服务器尝试读取对象时,我在服务器端发现类未找到异常。
之后,我尝试将客户端和服务器都构建为 libGDX 项目。仍然是同样的错误。
发球:
package com.mygdx.game;
import java.io.IOException;
import java.net.*;
public class Server {
public static void main(String[] args) {
int port = 8800;
try {
ServerSocket serverSocket = new ServerSocket(port);
while (true) {
System.out.println("raedy");
Socket clientSocket = serverSocket.accept();
System.out.println(clientSocket+"verbunden!");
Worker worker = new Worker(clientSocket);
worker.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.mygdx.game;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
public class Worker extends Thread{
private Socket clientSocket;
public Worker(Socket clientsocket) {
this.clientSocket = clientsocket;
}
@Override
public void run() {
System.out.println("worker started");
try {
ObjectInputStream in= new ObjectInputStream(clientSocket.getInputStream());
Object obj = (Object) in.readObject();
if(obj instanceof Message) {
Message msg= (Message) in.readObject();
System.out.println("Client said: "+msg.getMessage());
}
System.out.println("input auf"+clientSocket.getLocalPort());
ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream());
out.writeObject(new Message("Hello there!"));
System.out.println("output auf"+clientSocket.getPort());
} catch (IOException | ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.mygdx.game;
import java.io.Serializable;
public class Message implements Serializable{
private static final long serialVersionUID = 1L;
private String message;
public Message(String message) {
this.message = message;
}
public String getMessage(){
return message;
}
}
客户端具有相同的 Message 类,并且:
package com.mygdx.game.desktop;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import com.mygdx.game.MyGdxGame;
public class DesktopLauncher {
public static void main (String[] arg) {
int port = 8800;
try {
System.out.println("hello there!");
Socket client = new Socket("localhost", port );
ObjectOutputStream out = new ObjectOutputStream(client.getOutputStream());
out.writeObject(new Message("ich bin der client"));
System.err.println(client.getPort());
ObjectInputStream in = new ObjectInputStream(client.getInputStream());
Message msg= (Message) in.readObject();
System.out.println("Server said: "+msg.getMessage());
System.out.println(client.getLocalPort());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
new LwjglApplication(new MyGdxGame(), config);
}
}
所以我的问题是为什么相同的代码在普通的 java 中可以工作,但是当我构建与 libGDX 项目相同的项目并尝试那里的代码时它不起作用?
是的,消息类仅用于测试可序列化对象的传输方式。后来我想通过对象流发送游戏命令。
ps:你坚持到最后!谢谢 :D
pps:在java中的第一次尝试没有
Object obj = (Object) in.readObject();
if(obj instanceof Message)
解决方案
我真的建议你使用Kryonet,而不是自己从头开始编写所有的东西。它完全符合您的目标,成熟且经过 libGDX 的良好测试。
推荐阅读
- html - 是否可以通过直接包含 html 文件中的 html 来创建邮件?
- python - 响应回调访问正文
- c++ - 发送到不存在的目标时提升 asio UDP 套接字阻塞
- openapi - 在 Swagger OpenAPI 注解中定义数组
- java - 添加 'ndk { abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64' }' 后,Android 应用程序不兼容 64 位
- python - 通过动态键名对字典进行分组并在 Python 中聚合嵌套字典的一些键
- docker - docker新手,没有看到现场进行的本地更改
- php - 将页面从一个域重定向到另一个域(两个域都属于一个网站)
- magento - 变量 @theme__color__primary-alt 未定义
- .net - 当我得到一件物品时,$Expand 不起作用