Java客户机-服务器编程:客户机之间的共享内存
我正在用Java开发一个简单的2D多人游戏,遵循客户机-服务器模型。套接字编程方面的功能很简单: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
- 客户端向服务器发送其字符数据(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());