2015-09-14 95 views
1

我有一个Java服务器,它将具有两种不同类型的客户端,一个基于Java的控制台和一个基于Lua的客户端,服务器将控制该客户端。我已经得到了Lua的客户攀谈来回通过TCP套接字与ObjectInputStream,Java和Lua客户端进行网络连接

out = new PrintWriter(socket.getOutputStream(), true); 
in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

现在我想获得一个基于Java的客户端连接,我想用

out = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream())); 
in = new ObjectInputStream(new BufferedInputStream(socket.getInputStream())); 

我遇到的问题理解接受连接的最佳方式,不知道它是否是另一端的Lua或Java客户端。然后设置合适的流。

我应该只在初始连接上使用不同的端口吗?我希望更多的是从BufferedReader可以读取的ObjectOutputStream发送一个字符串。或者,如果它是PrintWriter或ObjectOutputStream,则应在设置之前使用较低级别的内容查看连接的内容。

指向深入教程或实际代码的链接将起作用。我无法找到超出其中一个或另一个的基本设置的资源。

谢谢先进。

+0

如果您不是专门使用Java客户端,则不应该使用ObjectOutputStream。使用XML或JSON等标准传输格式,或设计精确的二进制记录格式。 – RealSkeptic

+0

你会在XML或JSON之间推荐什么?我对这两个人的经历都差不多,这很少。 – Ditchbuster

+0

JSON更简单,我会说,并且是专门为表示对象而设计的。如果你没有选择XML的特定理由,那么我更喜欢JSON。但是,可能你甚至不需要这个。这取决于你需要交换的消息的性质。 –

回答

1

由于您建议提供听起来像两个完全不同的服务,因此在不同的端口提供这些服务是自然而恰当的。为了实现这一点,你的服务器将创建和管理两个单独的,在不同的端口上监听。一会提供一项服务;另一个会提供另一个。您可以使用任一线程或Selector或其组合来处理两个服务器套接字和所有客户端。

作为一个单独的问题,我建议您在依赖Object流之前仔细思考。如果您可以在更简单和/或更一般的协议的基础上实现您的服务,那么您将避免Java序列化的多重欢乐,并且您还将为使用其他语言编写的客户端敞开大门。

+0

谢谢!我已经有客户的线程。你在想每个'ServerSocket'的线程吗?这似乎是很自然的事情。我看看'Selector'。感谢Java序列化的领导,这个项目可能很简单,可以手动发送字符串或字节。 – Ditchbuster

+0

是的,因为给定的线程一次只能在一个'ServerSocket'上接受()',所以你需要一些方法来监视哪一个已准备好,否则要同时服务两者。一个'选择器'可以在一个线程中完成前者;后者需要为每个“ServerSocket”分开一个线程。 –