所以我已经编程了一段时间了,我第一次尝试制作多人游戏。我现在遇到的主要问题是在服务器端同时更新多个客户端的数据。
这是我的代码背后的概念:
- 客户端与服务器建立连接->
- 客户端根据客户端按下的键向服务器发送消息->
- 服务器根据客户端当前按下的键每秒自行更新 60 次
我的主要问题是第 3 步,我的问题是主线程中的语法错误:
public static void updatethings() {
for (ServerSocket i : ssList) {
i.calculatePos();
}
}
错误消息是:ServerSocket 类型的方法calculatePos() 未定义。
我试图做的是创建一个 ServerSocket 数组,并每秒更新它们 60 次。每个套接字都是它自己的服务器类线程。
下面列出了整个服务器程序:
这是服务器的主类。此类监听客户端连接,并在每次客户端连接时创建一个新线程。
public class ServerMain {
static ArrayList<ServerSocket> ssList = new ArrayList<ServerSocket>();
static int oh = 0;
public static void main(String[] args) throws IOException {
int portNumber = 9000;
boolean listening = true;
UpdaterThread update = new UpdaterThread();
update.start();
try (ServerSocket serverSocket = new ServerSocket(portNumber)) {
while (listening) {
new ServerThread(serverSocket.accept()).start();
ssList.add(serverSocket);
}
} catch (IOException e) {
System.err.println("Could not listen on port " + portNumber);
System.exit(-1);
}
}
//does not work
public static void updatethings() {
for (ServerSocket i : ssList) {
ServerSocket.calculatePos();
}
}
}
服务器线程类:
public class ServerThread
extends Thread {
private Socket socket = null;
byte input;
private float playery;
private float playerx;
public ServerThread(Socket socket) {
this.socket = socket;
}
public void calculatepos() {
if (input == 0) {
}
if (input == 1) {
playery = playery + 1;
}
if (input == 2) {
playerx = playerx - 1;
}
if (input == 3) {
playery = playery - 1;
}
if (input == 4) {
playerx = playerx + 1;
}
if (input == 5) {
playerx -= 0.7;
playery += 0.7;
}
if (input == 6) {
playerx -= 0.7;
playery -= 0.7;
}
if (input == 7) {
playerx += 0.7;
playery -= 0.7;
}
if (input == 8) {
playerx += 0.7;
playery += 0.7;
}
System.out.println(playerx);
System.out.println(playery);
}
public void run() {
try (
// PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
) {
String inputLine;
while ((inputLine = in.readLine()) != null) {
input = Byte.parseByte(inputLine);
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
更新线程类:
class UpdaterThread
extends Thread {
float time = 0;
float lasttime = 0;
public void run() {
while (true) {
time = Time.getTime();
if (time > 1000 / 60 + lasttime) {
lasttime = time;
ServerMain.updatethings();
}
try {
Thread.sleep(2);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
最佳答案
您的错误来自服务器。您一次又一次地存储相同的服务器套接字。并且您不存储您的 ServerThread
对象
ServerSocket接受() - http://download.java.net/jdk7/archive/b123/docs/api/java/net/ServerSocket.html#accept()
Listens for a connection to be made to this socket and accepts it. The method blocks until a connection is made. A new Socket s is created and, if there is a security manager, the security manager's checkAccept method is called with s.getInetAddress().getHostAddress() and s.getPort() as its arguments to ensure the operation is allowed. This could result in a SecurityException.
返回:新的Socket
block 引用>因此,处理客户端应该做的就是保存这个ServerThread对象。如果你也想要相关的返回套接字。 !
public class ServerMain { static ArrayList <Socket> sSocketList = new ArrayList<Socket>(); static ArrayList <ServerThread> sObjectList = new ArrayList<ServerThread>(); static int oh = 0; public static void main(String[] args) throws IOException { int portNumber =9000; boolean listening = true; UpdaterThread update =new UpdaterThread(); update.start(); try (ServerSocket serverSocket = new ServerSocket(portNumber)) { while (listening) { Socket s= serverSocket.accept(); ServerThread st= new ServerThread(s); sSocketList.add(s); sObjectList.add(st); st.start(); } } catch (IOException e) { System.err.println("Could not listen on port " + portNumber); System.exit(-1); } } //This might work now public static void updatethings() { for (ServerThread i : sObjectList){ i.calculatePos(); } } }
关于Java多客户端服务器程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27586408/