Writing to an AsynchronousSocketChannel and processing the data in an Event-based way

喜欢而已 提交于 2019-12-13 21:08:20

问题


I'm trying to figure out how to send data between sockets in Java (this is part of a bigger project and I'll get back and answer my previous two questions related to that once I can resolve this..). I would like to connect a client and a server socket asynchronously in Java, and then send messages between them, and get a callback, say, when I have sent a message from the client to the server.

I think I have managed to get the set-up working. Here is my code:

private AsynchronousServerSocketChannel socListener;
private AsycnchrnonousSocketChannel socClient;

//This is the GUI callback for the button that initiates the socket server
private void button_StartSocketServerActionPerformed(ava.awt.event.ActionEvent evt)
{
    try{
        InetAddress ipLocal= InetAddress.getLocalHost(); 
        InetSocketAddress ipSocket=new InetSocketAddress(ipLocal,8221);

        m_socListener= AsynchronousServerSocketChannel.open().bind(ipSocket);

        m_socListener.accept(null, new CompletionHandler<AsynchronousSocketChannel,Void>() 
                                   {
                                       @Override
                                       public void completed(AsynchronousSocketChannel ch, Void att) 
                                       {
                                            // accept the next connection
                                            m_socListener.accept(null, this);
                                            // handle this connection
                                       }
                                       @Override
                                       public void failed(Throwable exc, Void att)  { }
                                   }
                             );
        }
        catch (Exception e){ 
        }
}

//This is the GUI callback for the button that initiates the client socket
private void button_StartClientSocketActionPerformed(java.awt.event.ActionEvent evt) 
{
     try
     {
        socClient=AsynchronousSocketChannel.open();

        InetAddress ipLocal= InetAddress.getLocalHost();
        InetSocketAddress ipSocket=new InetSocketAddress(ipLocal,8221);
        socClient.connect(ipSocket, null, new CompletionHandler<Void,Void>() 
                                   {
                                       @Override
                                       public void completed(Void att1, Void att2) 
                                       {
                                            // handle this connection
                                       }
                                       @Override
                                       public void failed(Throwable exc, Void att) {}
                                   }
                            );
    }
    catch (Exception e){  
    }
}

I'm including the server and the client in the same file for simplicity of testing.

So supposing the connection is successfully established, and I have a process on a timer (say) that was writing data to the server socket, I'd like to have the client socket 'listen' for this new data being sent from the server and then generate a callback when a write occurs (without doing something like periodically checking via a timer and a while loop to check that whether new data has been added). This is accomplishable in C# and a nice tutorial is available at: http://www.developerfusion.com/article/3918/socket-programming-in-c-part-1/2/

Any tips on how to do this would be greatly appreciated. Thanks! Chris


回答1:


You could use RMI to accomplish that, the documentation can be found there: http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136424.html

With this, your server could notify your client as much as you need.



来源:https://stackoverflow.com/questions/16106957/writing-to-an-asynchronoussocketchannel-and-processing-the-data-in-an-event-base

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!