Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java客户机-服务器编程:客户机之间的共享内存_Java_Multithreading_Sockets_Client Server - Fatal编程技术网

Java客户机-服务器编程:客户机之间的共享内存

Java客户机-服务器编程:客户机之间的共享内存,java,multithreading,sockets,client-server,Java,Multithreading,Sockets,Client Server,我正在用Java开发一个简单的2D多人游戏,遵循客户机-服务器模型。套接字编程方面的功能很简单: 客户端向服务器发送其字符数据(x位置、y位置、健康点等) 服务器在存储所有不同客户端字符数据的表中注册更新的字符数据 服务器将表发送回客户端,以便客户端可以呈现其他字符 我遇到了一个奇怪的问题,我想帮助理解,这样我就可以推进项目。这是我正在运行的代码 import java.io.IOException; import java.io.PrintWriter; import java.net.S

我正在用Java开发一个简单的2D多人游戏,遵循客户机-服务器模型。套接字编程方面的功能很简单:

  • 客户端向服务器发送其字符数据(x位置、y位置、健康点等)
  • 服务器在存储所有不同客户端字符数据的表中注册更新的字符数据
  • 服务器将表发送回客户端,以便客户端可以呈现其他字符
我遇到了一个奇怪的问题,我想帮助理解,这样我就可以推进项目。这是我正在运行的代码

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Set;
import java.util.Vector;
import java.util.HashSet;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Server
{

    private static Vector<Integer> IDs = new Vector<>();

    public static void main(String[] args) throws Exception
    {
        ExecutorService pool = Executors.newFixedThreadPool(32);

        try (ServerSocket listener = new ServerSocket(40000)) 
        {
            System.out.println("The server is up.");
            while (true)
            {
                pool.execute(new Player(listener.accept()));
            }
        }
    }

    private static class Player implements Runnable
    {
        private Socket socket;
        private Scanner input;
        private PrintWriter output;
        private int ID;

        public Player(Socket socket)
        {
            this.socket = socket;
            this.ID = IDs.size() + 1;
            IDs.add(ID);
        }

        public void run()
        {
            try
            {
                input = new Scanner(socket.getInputStream());
                output = new PrintWriter(socket.getOutputStream(), true);

                while(input.hasNextLine())
                {
                    String result = "";
                    for(int i = 0; i < IDs.size(); i++)
                    {
                        result += (IDs.get(i) + " ");
                    }
                    output.println(result);
                }
            }
            catch(Exception e)
            {
                System.out.println(e);
            }
        }
    }
}
我希望发生的是:每次客户端向服务器发送任何消息时,服务器都会用一个ID列表进行响应(每个连接的客户端都会获得一个新的ID)

实际发生的情况:

连接的第二个客户端能够看到已经连接的第一个客户端。但是第一个客户端无法看到第二个客户端已连接

谢谢您的帮助。

服务器循环

while(input.hasNextLine())
{
    String result = "";
    for(int i = 0; i < IDs.size(); i++)
    {
        result += (IDs.get(i) + " ");
    }
    output.println(result);
}

这将使服务器按照预期使用来自客户端的线路,并允许您查看/验证数据流。

您从未使用来自客户端的任何输入。您的意思是什么?我不清楚你所说的“消费”是什么意思,因此也不清楚为什么它会起作用。@vrealwavy刚刚补充了一个答案,解释了user207421的含义。Legend。非常感谢你。你能推荐一个好的资源来学习这类东西吗?一个好的资源来学习如果你不从流中读取数据,你就不会使用数据?对不起,没有,我不知道有哪种教学资源是这样的。
while(input.hasNextLine())
{
    String result = "";
    for(int i = 0; i < IDs.size(); i++)
    {
        result += (IDs.get(i) + " ");
    }
    output.println(result);
}
System.out.println(this.ID + ": " + input.nextLine());