我试图创建一个UDP服务器,每个新游戏实例和客户端都有两个插槽。
它必须是游戏机制的UDP原因。我写了这个:
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) - 接受连接并将它们传递给&#39; Player的构造函数&#39;而在玩家的课程中,这一切都很有趣。
如果有人可以提供帮助并告诉我,应该如何完成,例如3个步骤(我不需要代码):
另外,如何停止第三次连接&#39;并将其重定向到一个新的游戏实例? (导致它的1v1)。