LibGDX 服务器线程



我目前正在用libGDX开发一个类似MOBA的游戏,但我正在努力使用服务器。目前,我为每个连接和一个存储数据的关键区域都有一个线程。我的问题是,有线程,它们正在写入关键区域并同时从中读取。有人可以帮助我吗?

以下是我的课程:客户端线程:

package at.mobaserver;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import at.motm.model.GameObject;
import at.motm.model.Projectile;
import com.badlogic.gdx.math.Intersector;
import com.badlogic.gdx.math.Rectangle;
public class ClientConnection implements Runnable
{
private ObjectInputStream ois;
private ObjectOutputStream oos;
private Socket socket;
private GameServer server;
private GameObject receivedObject;
private Rectangle r;
private Projectile projectile;
private boolean found;
public ClientConnection(Socket socket, GameServer server)
{
    try
    {
        this.socket = socket;
        this.oos = new ObjectOutputStream(socket.getOutputStream());
        this.ois = new ObjectInputStream(socket.getInputStream());
        this.server = server;
        this.receivedObject = null;
        this.projectile = null;
    }
    catch (IOException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
@Override
public void run()
{
    try
    {
        this.oos.writeLong(Thread.currentThread().getId());
        this.oos.flush();
    }
    catch (IOException e1)
    {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    while (true)
    {
        try
        {
            // Add GameObjects to list
            // this.server.getMutex().lock();
            this.oos.reset();
            // Hitdetection
            if (this.projectile != null)
            {
                projectileHitDetection();
            }
            // Write Objects to client
            this.oos.writeObject(this.server.getSendingList());
            this.oos.flush();
            // Add Objects to Severobject Arraylist
            // this.server.getMutex().lock();
            addObjectsToList();
            // Add Projectiles to Serverobject Arraylist
            readProjectiles();
            // this.server.getMutex().unlock();
            // this.server.getMutex().unlock();
        }
        catch (ClassNotFoundException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
            break;
        }
    }
}
private void readProjectiles() throws ClassNotFoundException, IOException
{
    synchronized (this.server.getProjectiles())
    {
        this.projectile = (Projectile) this.ois.readObject();
        if (this.projectile != null)
        {
            this.found = false;
            for (int i = 0; i < this.server.getProjectiles().size(); i++)
            {
                if (this.server.getProjectiles().get(i).getThreadID() == Thread
                        .currentThread().getId())
                {
                    this.server.getProjectiles().set(i, this.projectile);
                    this.found = true;
                    break;
                }
            }
            if (!this.found)
            {
                this.server.getProjectiles().add(this.projectile);
            }
        }
    }
}
private void addObjectsToList() throws ClassNotFoundException, IOException
{
    synchronized (this.server.getObjects())
    {
        this.receivedObject = (GameObject) this.ois.readObject();
        this.found = false;
        for (int i = 0; i < this.server.getObjects().size(); i++)
        {
            if (this.server.getObjects().get(i).getThreadID() == Thread
                    .currentThread().getId())
            {
                this.server.getObjects().set(i, this.receivedObject);
                this.found = true;
                break;
            }
        }
        if (!this.found)
        {
            this.server.addObject(this.receivedObject);
        }
    }
}
private void projectileHitDetection()
{
    synchronized (this.server.getObjects())
    {
        this.r = new Rectangle(this.projectile.getPosition().x,
                this.projectile.getPosition().y,
                this.projectile.getWidth(), this.projectile.getHeight());
        for (int i = 0; i < this.server.getObjects().size(); i++)
        {
            if (this.server.getObjects().get(0).getTeam() != this.projectile
                    .getTeam())
            {
                Rectangle r1 = new Rectangle(this.server.getObjects()
                        .get(0).getPosition().x, this.server.getObjects()
                        .get(0).getPosition().y, this.server.getObjects()
                        .get(0).getWidth(), this.server.getObjects().get(0)
                        .getHeight());
                if (Intersector.overlaps(this.r, r1))
                {
                    System.out.println("test");
                    this.server.getProjectiles().remove(this.projectile);
                    break;
                }
            }
        }
    }
}
}

关键区域: 包在.mobaserver;

import java.util.ArrayList;
import at.motm.model.GameObject;
import at.motm.model.Projectile;
public class GameServer
{
private ArrayList<GameObject> objects;
private ArrayList<Projectile> projectiles;
private ArrayList<GameObject> sendList;
public GameServer()
{
    this.objects = new ArrayList<GameObject>();
    this.projectiles = new ArrayList<Projectile>();
    this.sendList = new ArrayList<GameObject>();
}
public ArrayList<GameObject> getSendingList()
{
    synchronized (this.sendList)
    {
        this.sendList.clear();
        for (GameObject o : this.objects)
        {
            if (o.isAlive())
            {
                this.sendList.add(o);
            }
        }
        this.sendList.addAll(this.projectiles);
        return this.sendList;
    }
}
public ArrayList<GameObject> getObjects()
{
    synchronized (this.objects)
    {
        return this.objects;
    }
}
public void setObjects(ArrayList<GameObject> objects)
{
    synchronized (objects)
    {
        this.objects = objects;
    }
}
public void addObject(GameObject o)
{
    synchronized (this.sendList)
    {
        this.objects.add(o);
    }
}
public ArrayList<Projectile> getProjectiles()
{
    synchronized (this.projectiles)
    {
        return this.projectiles;
    }
}
public void setProjectiles(ArrayList<Projectile> projectiles)
{
    synchronized (this.projectiles)
    {
        this.projectiles = projectiles;
    }
}
public void addProjectile(Projectile o)
{
    synchronized (this.sendList)
    {
        this.projectiles.add(o);
    }
}
}

我已经解决了我的问题。我使用CopyAndWriteArrayList而不是普通的ArrayLists。

最新更新