【发布时间】:2015-07-24 15:41:56
【问题描述】:
在创建 UDP 连接并从客户端连接到服务器后,它会随机停止工作。为什么会发生这种情况?
在使用“localhost”作为 IP 的同一台计算机上运行客户端和服务器时通常不会发生这种情况,但在同一网络上使用不同计算机时会发生这种情况。
当我一开始尝试使用不同的计算机进行连接时,它可以工作,但过了一段时间它就停止了;连接被“终止”。
另外,请忽略game.player 的东西,它只是我的一个玩家。
这是我的代码:
客户:
public class GameClient extends Thread {
private InetAddress ipAddress;
private DatagramSocket socket;
private Main game;
public GameClient(Main main, String ipAddress) {
this.game = main;
try {
this.socket = new DatagramSocket();
this.ipAddress = InetAddress.getByName(ipAddress);
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
public void run() {
while (true) {
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
try {
socket.receive(packet);
} catch (IOException e) {
e.printStackTrace();
}
String message = new String(packet.getData());
message = message.trim();
if (message.startsWith("00")) {
System.out.println("Player connected. Got server response...");
String msg = "01" + game.player.getPos();
sendData(msg.getBytes());
}
if (message.startsWith("01")) {
message = message.substring(2);
List<String> coords = Arrays.asList(message.split(","));
game.updateMP(coords);
String msg = "01" + game.player.getPos();
sendData(msg.getBytes());
}
}
}
public void sendData(byte[] data) {
DatagramPacket packet = new DatagramPacket(data, data.length, ipAddress,
1331);
try {
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}
}
}
我的服务器类:
public class GameServer extends Thread {
private DatagramSocket socket;
private Main game;
public GameServer(Main main) {
this.game = main;
try {
this.socket = new DatagramSocket(1331);
} catch (SocketException e) {
e.printStackTrace();
}
}
public void run() {
while (true) {
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
try {
socket.receive(packet);
} catch (IOException e) {
e.printStackTrace();
}
String message = new String(packet.getData());
message = message.trim();
if (message.startsWith("00")) {
message = message.substring(2);
game.playerConnected = true;
sendData("00".getBytes(), packet.getAddress(), packet.getPort());
}
if (message.startsWith("01")) {
message = message.substring(2);
List<String> coords = Arrays.asList(message.split(","));
game.updateMP(coords);
String msg = "01" + game.player.getPos();
sendData(msg.getBytes(), packet.getAddress(), packet.getPort());
}
}
}
public void sendData(byte[] data, InetAddress ipAddress, int port) {
DatagramPacket packet = new DatagramPacket(data, data.length, ipAddress,
port);
System.out.println(ipAddress + ", " + port);
try {
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}
}
}
还有我的“主要”课程: (只是其中的一部分):
if (JOptionPane.showConfirmDialog(null, "Do you want to run the server?") == 0) {
socketServer = new GameServer(this);
socketServer.start();
socketType = 0;
} else {
socketClient = new GameClient(this, JOptionPane.showInputDialog(null, "IP:"));
socketClient.start();
socketClient.sendData("00".getBytes());
socketType = 1;
}
【问题讨论】:
-
异步网络 I/O 是一个已解决的问题。您自己做而不是使用 I/O 库有什么特别的原因吗?
-
我想学习...刚开始的时候我记得我在 youtube 上看到这个人从头开始制作游戏.. 更准确地说是 DesignByZephyr。
-
@durron597 Tbh 我不确定您所说的“异步网络 I/O”是什么意思。我用谷歌搜索了它,据我所知,它是某种输入/输出的东西。如果更好,我应该实施它以及如何实施?
-
像netty 这样的库会为您做很多低级别的数据包管理,让您有时间编写游戏而不是乱搞像
DatagramSocket这样的东西 -
谢谢,我去看看。希望有人能够解决这个问题dou :)
标签: java networking udp