Multithreading UDP服务器和多个客户端(1v1游戏)
我正在尝试创建一个UDP服务器,每个游戏和客户端的新实例有两个插槽 这一定是游戏机制的原因。我写道:Multithreading UDP服务器和多个客户端(1v1游戏),multithreading,networking,Multithreading,Networking,我正在尝试创建一个UDP服务器,每个游戏和客户端的新实例有两个插槽 这一定是游戏机制的原因。我写道: public class Server { private static HashSet<Integer> ports = new HashSet<Integer>(); // these are player's IDs static ArrayList<InetAddress> addresses = new ArrayList<
public class Server {
private static HashSet<Integer> ports = new HashSet<Integer>(); // these are player's IDs
static ArrayList<InetAddress> addresses = new ArrayList<InetAddress>();
public static boolean player1_active = false, player2_active = false;
public static PlayerCredits p1, p2, temp;
public static void main(String[] args) throws Exception {
// The default port
int serverport = 8888;
DatagramSocket udpServerSocket = new DatagramSocket(serverport);
DatagramPacket sendpacket;
System.out.println("Server started...\n");
while(true)
{
byte[] receiveData = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
udpServerSocket.receive(receivePacket);
String clientMessage = (new String(receivePacket.getData())).trim();
System.out.println("Client Connected - Socket Address: " + receivePacket.getSocketAddress());
System.out.println("Client message: \"" + clientMessage + "\"");
InetAddress clientIP = receivePacket.getAddress();
addresses.add(clientIP);
System.out.println("Client IP Address & Hostname: " + clientIP + ", " + clientIP.getHostName() + "\n");
// Get the port number which the recieved connection came from
int clientport = receivePacket.getPort();
System.out.println("Adding "+clientport);
ports.add(clientport);
// Response message
String returnMessage = clientMessage.toUpperCase();
System.out.println(returnMessage);
// Create an empty buffer/array of bytes to send back
byte[] sendData = new byte[1024];
temp = new PlayerCredits(clientport, clientIP);
if(!player1_active){
p1 = new PlayerCredits(clientport, clientIP);
player1_active = true;
}
if(temp.port != p1.port && temp.ad != p1.ad)
if(!player2_active){
p2 = new PlayerCredits(clientport, clientIP);
player2_active = true;
}
DatagramPacket sendPacket;
if(p2 == null){
String awaiting = "WAITING FOR SECOND PLAYER";
sendData = awaiting.getBytes();
sendPacket= new DatagramPacket(sendData, sendData.length, p1.ad, p1.port);
udpServerSocket.send(sendPacket);
}
else{
String awaiting = "SECOND PLAYER INCOMING";
sendData = awaiting.getBytes();
if(p2!=null){
sendPacket = new DatagramPacket(sendData, sendData.length, p2.ad, p2.port);
udpServerSocket.send(sendPacket);
}
sendPacket = new DatagramPacket(sendData, sendData.length, p1.ad, p1.port);
udpServerSocket.send(sendPacket);
}
}
}
public static class PlayerCredits{
int port;
InetAddress ad;
public PlayerCredits(int p, InetAddress a){
this.port = p;
this.ad = a;
}
}
现在我有两个人在联系——但正如你可能会说的那样——这是错误的。我需要以某种方式实现Multisocket或其他东西上的每个播放器,或者通过TCP将它们连接起来,然后用新的数据报监听新线程
正如我所知,最好的方法是在主线程上创建一个侦听器服务器TCP—接受连接并将它们传递给“玩家的构造函数”,然后在玩家的类中使整个过程变得有趣
如果有人可以帮助并告诉我,应该如何像我不需要代码那样分3步完成:
与TCP的连接
使用播放器创建新线程并在UDP上侦听
当两名玩家连接时开始游戏
另外,如何停止“第三个连接”并将其重定向到新的游戏实例?因为它是1v1。不确定您到底需要什么。什么是“multisocket”?我建议你编辑你的代码,删除所有不相关的游戏机制。只需保留现有的套接字代码,并提供您希望执行的操作的伪代码。主要问题是,我不知道哪些操作应该由TCP处理,哪些操作应该由UDP处理。整个队伍?我的想法是我现在就写这篇文章:-在主类中,使用TCP将端口连接到hashmap和IPAddress-当我有两个玩家时-打开一个游戏,将他们的ip和端口传递给构造函数-在“游戏”类中,使用UDP使整个游戏机械化,我只是不知道在1v1游戏clientserverclient实时情况下应该如何做到这一点。只是需要一个点-从哪里开始。仍然不清楚。你的最终目标是什么?你想达到什么目标?为什么是UDP,为什么是TCP?到目前为止,我还不知道你需要什么以及为什么。我正在创建一个1v1游戏,它必须实时更新-这是一个战斗游戏。客户端1连接到服务器,他正在等待客户端2。当客户端2连接时,游戏打开,队列服务器等待新的一对。Stack说,整个游戏必须由数据报来处理,因为数据报速度更快,而且通过TCP进行“第一次连接”和“排队”。我试图实现什么:我不知道上面的说法是否正确——因为如果是的话——我将尝试在TCP上编写这个队列。如果没有-我会尝试另一种方法。好的,首先要做的事。UDP绝不比TCP“快”。它们只是为了不同的目的。UDP是一种消息协议——当对等点以封装消息的形式相互通信时,它工作得最好。TCP是一种面向流的协议——当对等点之间保持通信通道并相互发送数据时,它工作得最好。一个非常松散的类比是电话对话TCP与电子邮件UDP。通过电话交谈,你可以让两个人继续互相交谈。通过电子邮件,你可以让一个人向另一个人发送消息。你不能说哪个更快。