我已经在codereview上提前一天提出过这个问题,但是我还没有收到任何回复,所以我尽管在这里试着问一下。Java - 简单的网络游戏极其缓慢
让我告诉你我想要做:
弹出一个窗口,询问用户是否要运行一个服务器或客户端。选择服务器将启动LAN上的服务器。选择客户端将尝试连接到该服务器。一旦服务器正在运行并且客户端已连接,一个窗口会弹出两个方块。服务器/客户端都可以使用箭头键移动它们的正方形。
这就是我得到:
在想要的速度移动服务器的广场,但他的动作是在客户端的侧面非常连贯。另一方面,客户方正似乎以每秒约3个像素的速度移动(方式太慢)。
这是我在问:
我想我的问题是很明显的。我所做的只是通过互联网发送2个整数。现代网络游戏发送多比这更多的数据,他们几乎没有滞后,所以显然我做错了什么,但什么?
Server.java:
// server class
public class Server {
// networking objects
private ServerSocket serverSocket;
private Socket clientSocket;
private DataOutputStream clientOutputStream;
private DataInputStream clientInputStream;
// game objects
private Vec2D serverPos, clientPos;
private GameManager gameManager;
// run method
public void run() {
// intialization try-catch block
try {
// setup sockets
serverSocket = new ServerSocket(1111);
clientSocket = serverSocket.accept();
// setup I/O streams
clientOutputStream = new DataOutputStream(clientSocket.getOutputStream());
clientInputStream = new DataInputStream(clientSocket.getInputStream());
} catch(IOException e) { Util.err(e); }
// declare & intialize data exchange thread
Thread dataExchange = new Thread(
new Runnable() {
// run method
@Override
public void run() {
// I/O try-catch block
try {
// exchange-loop
while(true) {
// write x & y, flush
synchronized(gameManager) {
clientOutputStream.writeInt(serverPos.x);
clientOutputStream.writeInt(serverPos.y);
clientOutputStream.flush();
}
// read x & y
clientPos.x = clientInputStream.readInt();
clientPos.y = clientInputStream.readInt();
}
} catch(IOException e) { Util.err(e); }
}
}
);
// setup game data
serverPos = new Vec2D(10, 10);
clientPos = new Vec2D(300, 300);
gameManager = new GameManager(serverPos, clientPos, serverPos);
// start data exchange thread
dataExchange.start();
// start main loop
while(true) {
// get keyboard input
synchronized(gameManager) {
gameManager.update();
}
// repaint, sleep
gameManager.repaint();
Util.sleep(15);
}
}
}
Client.java:
// client class
public class Client {
// networking objects
private Socket serverConnection;
private DataOutputStream serverOutputStream;
private DataInputStream serverInputStream;
// game objects
private Vec2D serverPos, clientPos;
private GameManager gameManager;
// run method
public void run() {
// intialization try-catch block
try {
// setup socket
serverConnection = new Socket(InetAddress.getByName("192.168.0.19"), 1111);
// setup I/O streams
serverOutputStream = new DataOutputStream(serverConnection.getOutputStream());
serverInputStream = new DataInputStream(serverConnection.getInputStream());
} catch(IOException e) { Util.err(e); }
// declare & intialize data exchange thread
Thread dataExchange = new Thread(
new Runnable() {
// run method
@Override
public void run() {
// I/O try-catch block
try {
// exchange-loop
while(true) {
// read x & y
synchronized(gameManager) {
serverPos.x = serverInputStream.readInt();
serverPos.y = serverInputStream.readInt();
}
// write x & y, flush
serverOutputStream.writeInt(clientPos.x);
serverOutputStream.writeInt(clientPos.y);
serverOutputStream.flush();
}
} catch(IOException e) { Util.err(e); }
}
}
);
// setup game data
serverPos = new Vec2D(10, 10);
clientPos = new Vec2D(300, 300);
gameManager = new GameManager(serverPos, clientPos, clientPos);
// start data exchange thread
dataExchange.start();
// start main loop
while(true) {
// get keyboard input
synchronized(gameManager) {
gameManager.update();
}
// repaint, sleep
gameManager.repaint();
Util.sleep(15);
}
}
}
我摆脱了一堆代码的 - 我希望现在没有混乱。谢谢您的帮助!
你的问题有很多代码。为了更快地获得更好的帮助,请发布[SSCCE(链接)](http://sscce.org)。 – Doorknob 2013-04-22 13:05:16
@ Doorknob我摆脱了一些我认为不需要的东西。 – Aaron 2013-04-22 13:12:46
TCP是我认为的问题,它得到了很多的承认,这就是为什么它需要太多的时间,使用UDP,阿门:) – anshulkatta 2013-04-22 13:23:44