【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”
非响应是啥意思啊?
随便说两句哈,没太理解lz意思
1.javaweb 跟mina交互系统是一个系统?service层直接调用mina发消息就可以啊
2.javaweb跟mina交互是两个系统?那就是两个java同构系统通信问题了,可以http也可以rpc也可以消息
3.javaweb 跟c++异构交互系统没有构建,用mina构建起通信,协议可以用thrift protobuf 什么的然后后面操作同上1,2
ConnectFuture 对象的 getSession, 得到IoSession就可以使用Write了。
当然,CF对象的状态,Write时关联的Handler和Encode类, 都要保证正确才行。
举个例子,作为客户端,SocketConnector 发起连接时,connect()函数会返回一个ConnectFuture对象,通过这个对象可判断是否已经连接,如果已经连接的话,通过它获取IoSession对象,就可以Write了。
随时Write就是主动发送了。
我的服务端类似这样的,怎么可以获得IOSeesion 并将其静态化供外部调用呢?不在这个类里用。在javaweb的service层直接调用这个连接发送消息
package mina.PrefixedStringCodec; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.charset.Charset; import org.apache.mina.core.service.IoAcceptor; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.prefixedstring.PrefixedStringCodecFactory; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; public class TcpServer { public static void main(String[] args) throws IOException { IoAcceptor acceptor = new NioSocketAcceptor(); // 4字节的Header指定Body的字节数,对这种消息的处理 acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new PrefixedStringCodecFactory(Charset.forName("UTF-8")))); acceptor.setHandler(new TcpServerHandle()); acceptor.bind(new InetSocketAddress(8888)); } } class TcpServerHandle extends IoHandlerAdapter { //@Override public void exceptionCaught(IoSession session, Throwable cause) throws Exception { cause.printStackTrace(); } // 接收到新的数据 //@Override public void messageReceived(IoSession session, Object message) throws Exception { String msg = (String) message; System.out.println("messageReceived:" + msg); } //@Override public void sessionCreated(IoSession session) throws Exception { System.out.println("sessionCreated"); } //@Override public void sessionClosed(IoSession session) throws Exception { System.out.println("sessionClosed"); } }
write 也是线程安全的,每一个netty的channel是有一个writelock的,看了个大概,不是太透彻。
注:提个建议哈,我觉得lz先写代码,多看文档,多思考下,可以自己解决的,再说问问题很不靠谱,没人回答很正常,有人回答跟中彩票似的
private void write0(NioSocketChannel channel) { boolean open = true; boolean addOpWrite = false; boolean removeOpWrite = false; long writtenBytes = 0; final SocketSendBufferPool sendBufferPool = this.sendBufferPool; final SocketChannel ch = channel.socket; final Queue<MessageEvent> writeBuffer = channel.writeBuffer; final int writeSpinCount = channel.getConfig().getWriteSpinCount(); synchronized (channel.writeLock) { channel.inWriteNowLoop = true; for (;;) {
Server端更简单啊,
public void sessionCreated(IoSession session) throws Exception { System.out.println("sessionCreated"); }
当然,你得在这个响应事件中把它的引用在其它地方保存下来,也要在它Close时把其它地方的引用除掉。
非响应是啥意思啊?
随便说两句哈,没太理解lz意思
1.javaweb 跟mina交互系统是一个系统?service层直接调用mina发消息就可以啊
2.javaweb跟mina交互是两个系统?那就是两个java同构系统通信问题了,可以http也可以rpc也可以消息
3.javaweb 跟c++异构交互系统没有构建,用mina构建起通信,协议可以用thrift protobuf 什么的然后后面操作同上1,2
ConnectFuture 对象的 getSession, 得到IoSession就可以使用Write了。
当然,CF对象的状态,Write时关联的Handler和Encode类, 都要保证正确才行。
举个例子,作为客户端,SocketConnector 发起连接时,connect()函数会返回一个ConnectFuture对象,通过这个对象可判断是否已经连接,如果已经连接的话,通过它获取IoSession对象,就可以Write了。
随时Write就是主动发送了。
引用来自“szf”的评论
举个例子,作为客户端,SocketConnector 发起连接时,connect()函数会返回一个ConnectFuture对象,通过这个对象可判断是否已经连接,如果已经连接的话,通过它获取IoSession对象,就可以Write了。
随时Write就是主动发送了。
我的服务端类似这样的,怎么可以获得IOSeesion 并将其静态化供外部调用呢?不在这个类里用。在javaweb的service层直接调用这个连接发送消息
write 也是线程安全的,每一个netty的channel是有一个writelock的,看了个大概,不是太透彻。
注:提个建议哈,我觉得lz先写代码,多看文档,多思考下,可以自己解决的,再说问问题很不靠谱,没人回答很正常,有人回答跟中彩票似的
引用来自“szf”的评论
举个例子,作为客户端,SocketConnector 发起连接时,connect()函数会返回一个ConnectFuture对象,通过这个对象可判断是否已经连接,如果已经连接的话,通过它获取IoSession对象,就可以Write了。
随时Write就是主动发送了。
引用来自“颖辉小居”的评论
我的服务端类似这样的,怎么可以获得IOSeesion 并将其静态化供外部调用呢?不在这个类里用。在javaweb的service层直接调用这个连接发送消息
Server端更简单啊,
这里的session就已经是可以发包的对象了,直接调用它的write就是了。当然,你得在这个响应事件中把它的引用在其它地方保存下来,也要在它Close时把其它地方的引用除掉。