我正在为一个班级做一个项目,我们正在创建一个可以在局域网上与2-4名玩家一起玩的游戏。尽管我们的小组成员在此之前都没有做过任何Java联网工作,但我们愚蠢地认为这并不难理解。无论如何,让网络正常工作的任务落在了我身上,但我完全不知道该怎么做。我在网上找不到任何教程,除了非常基本的东西,比如从单个客户端向服务器传递字符串。所以我有几个问题。
首先,如何将多个客户端连接到一个服务器。我需要为每一个创建一个新的ServerSocket吗?
其次,有没有一些易于使用的库可以为我抽象其中的一些内容?
我知道这些可能是非常基本的问题,但我确实做了相当多的阅读,但我仍然一无所获。
发布于 2011-03-09 05:18:42
Akka的remote actors可能会有所帮助,下面是一个基本的客户端-服务器连接的例子:
// server code
class HelloWorldActor extends UntypedActor {
public void onReceive(Object msg) {
getContext().replySafe(msg + " World");
}
}
remote().start("localhost", 9999).register(
"hello-service",
actorOf(HelloWorldActor.class));
// client code
ActorRef actor = remote().actorFor(
"hello-service", "localhost", 9999);
Object res = actor.sendRequestReply("Hello");Akka确实提高了抽象级别,就像RPC一样,所以看起来您只是在与本地对象交互。它还有助于并发性和可伸缩性,但在您的情况下,这可能不是什么问题。
发布于 2011-03-09 04:51:01
由于这是一个学习练习,我建议不要试图在basic sockets API之上寻找一个库。每个Java开发人员都应该知道这些东西是如何工作的。
您可以在服务器端创建一个ServerSocket来侦听端口上的传入连接。坐在一个循环中等待连接。当您连接到客户端时,最简单的方法是启动一个线程来管理该连接。当客户端关闭连接(或者存在io错误断开的连接)时,线程终止。
然后你需要设计在线协议。通常,您希望每个请求以表示请求类型的4字节(int)开始。然后根据请求类型解释其余部分。在对字符串进行编码时,请决定使用基于长度的编码还是基于终止符的编码。
实际上,通过练习弄清楚这些东西是如何工作的,这将是非常有教育意义的。
发布于 2011-03-09 06:50:00
尽管我完全同意Konstantin的观点,即您至少应该使用纯套接字一次,但您确实提到这是用于软件工程课程的,我认为您不应该在编写应用程序代码的基础上重新发明另一个网络库。
如果您需要一个库,Apache Mina和Netty是两个用于分布式网络的基于Java的框架。
我以前使用过Mina,它将一些低级套接字的复杂性抽象到一个事件驱动的框架中。查看带有时间服务器示例的this快速入门指南,并注意MinaTimeServer和TimeServerHandler类的简单性。只需在处理程序中创建一个会话,并将所需的逻辑放入MessageReceived()中即可。您不必处理将字符串编码为字节数组或编组等问题。
我没有和Netty在一起的经验,所以我不会对此发表评论。
https://stackoverflow.com/questions/5238135
复制相似问题