Jos*_*mon 10 java sockets communication web
我想在Netty nio中创建一个具有两个客户端和一个服务器的通信系统.更具体地说,首先,我希望当两个客户端与服务器连接以从服务器发送消息时,之后能够在两个客户端之间传递数据.我正在使用此示例提供的代码.我可以在这里找到我对代码的修改:链接
似乎serverHandler中的channelRead在第一个客户端被连接时工作,因此它总是返回1但是当连接第二个客户端时不会更改为2.当两个客户端连接到服务器时,如何从服务器正确检查?如何从客户端的主要功能中动态读取此值?那么这是让两个客户沟通的最佳方式?
EDIT1:显然似乎客户端服务正在运行并直接关闭,因此每次运行新的NettyClient时都会连接,但之后关闭连接.所以计数器总是从0到1.正如我在下面的评论中所建议的那样,我在相同的端口使用telnet测试它,并且计数器似乎正常增加,但是,NettyClient服务没有.
编辑2:似乎我得到的问题是从中future.addListener(ChannelFutureListener.CLOSE);获得channelRead的ProcessingHandler class.当我评论它似乎代码工作.但是,我不确定评论的后果是什么.此外,我希望从客户端的主要功能检查返回消息何时是特定的两个.如何,我可以创建一个等待来自服务器的特定消息的方法,同时它阻止主要功能.
static EventLoopGroup workerGroup = new NioEventLoopGroup();
static Promise<Object> promise = workerGroup.next().newPromise();
public static void callClient() throws Exception {
String host = "localhost";
int port = 8080;
try {
Bootstrap b = new Bootstrap();
b.group(workerGroup);
b.channel(NioSocketChannel.class);
b.option(ChannelOption.SO_KEEPALIVE, true);
b.handler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new RequestDataEncoder(), new ResponseDataDecoder(), new ClientHandler(promise));
}
});
ChannelFuture f = b.connect(host, port).sync();
} finally {
//workerGroup.shutdownGracefully();
}
}
Run Code Online (Sandbox Code Playgroud)
我想在main函数内部调用方法并返回结果,当它为2时继续使用主要功能.但是,我无法在内部调用callClient,因为它将在同一个客户端运行多次.
callBack();
while (true) {
Object msg = promise.get();
System.out.println("Case1: the connected clients is not two");
int ret = Integer.parseInt(msg.toString());
if (ret == 2){
break;
}
}
System.out.println("Case2: the connected clients is two");
// proceed with the main functionality
Run Code Online (Sandbox Code Playgroud)
如何更新第一个客户端的promise变量.当我运行两个客户端时,对于第一个客户端,我总是收到消息:
案例1:连接的客户端不是两个
似乎承诺没有正常更新,而对于第二个客户我总是收到:
案例2:连接的客户端是两个
如果我没记错的话,ChannelHandlerContext 是每个通道一个,并且它的管道中可以有多个 ChannelHandler。您的通道变量是处理程序类的实例变量。并且您为每个连接创建一个新的ProcessingHandler 实例。因此,一旦初始化,每个变量都会有一个且仅有一个连接channels- 这是为其创建的连接。
请参阅new ProcessingHandler()服务器代码(NettyServer.java)中的 initChannel 函数。
您可以将channels变量设置为静态,以便在ProcessingHandler 实例之间共享。或者您可以在其他地方创建单个ProcessingHandler实例(例如作为函数中的局部变量run()),然后将该实例传递给addLastcall而不是new ProcessingHandler().
| 归档时间: |
|
| 查看次数: |
513 次 |
| 最近记录: |