Java多客户端服务器程序
所以我已经编程了一段时间,我第一次尝试制作一个多人游戏。我现在面临的主要问题是同时更新服务器端多个客户端的数据 以下是我的代码背后的概念:Java多客户端服务器程序,java,multithreading,sockets,Java,Multithreading,Sockets,所以我已经编程了一段时间,我第一次尝试制作一个多人游戏。我现在面临的主要问题是同时更新服务器端多个客户端的数据 以下是我的代码背后的概念: 客户端与服务器建立连接-> 客户端根据客户端上按下的键向服务器发送消息-> 根据客户端当前按下的键,服务器每秒更新自身60次 我的主要问题是步骤3,我的问题是主线程中的语法错误: public static void updatethings() { for (ServerSocket i : ssList) { i.calculat
public static void updatethings() {
for (ServerSocket i : ssList) {
i.calculatePos();
}
}
错误消息是:ServerSocket类型的calculatePos()方法未定义
我试图做的是制作一个ServerSockets数组,并每秒更新它们60次。每个套接字都是它自己的服务器类线程
Iv在下面列出了整个服务器程序:
这是服务器的主类。此类侦听客户端连接,并在每次客户端连接时生成一个新线程
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接受()
侦听与此套接字的连接并接受它。该方法会一直阻塞,直到建立连接为止。正在安装一个新的插座s
创建,如果有安全管理器,则安全管理器的
使用s.getInetAddress().getHostAddress()调用checkAccept方法
和s.getPort()作为其参数,以确保允许该操作。
这可能会导致SecurityException
返回:新套接字
因此,处理客户机时应该做的是保存这个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();
}
}
}
public类ServerMain{
静态ArrayList sSocketList=新ArrayList();
静态ArrayList sObjectList=新建ArrayList();
静态int-oh=0;
公共静态void main(字符串[]args)引发IOException{
int端口号=9000;
布尔监听=真;
UpdaterThread update=新的UpdaterThread();
update.start();
try(ServerSocket-ServerSocket=newserversocket(端口号)){
边听{
sockets=serverSocket.accept();
ServerThread st=新的ServerThread;
sSocketList.add(s);
sObjectList.add(st);
st.start();
}
}捕获(IOE异常){
System.err.println(“无法侦听端口”+端口号);
系统退出(-1);
}
}
//这可能会奏效
公共静态void updatethings(){
对于(ServerThread i:sObjectList){
i、 calculatePos();
}
}
}
ServerSocket是你自己写的吗?如果是的话,写下这个方法。如果没有,请进入API以了解如何计算位置。您甚至不太可能有多个ServerSocket
对象,因此没有必要列出它们,也没有必要对其进行迭代。dood,你的代码在sockets=newserversocket.accept()行有语法错误;我真的不明白为什么,在大多数情况下,你的代码很有意义。