-
如何实现socket共享。0
a在项目启动时起一个tcp监听的线程(TcpThread类),这个tcp为长连接,每次与b交互都在一个socket里面,每次接受到tcp请求并回复tcp消息都在a的TcpThread类中完成。
现有需求,c访问a的Action,a在Action中如何获取TcpThread中的socket发送tcp给b?
可能有点绕口,问题就是如何共享socket实现tcp交互。
这个socket必须是从TcpThread类中取得。2014年6月18日 09:41
1个答案 按时间排序 按投票排序
-
采纳的答案
这种情况下,你不应该再使用阻塞式sock通信了。操作系统为我们提供了不止一种通信模型能让我们实现(非)异步的(非)阻塞式通信,以便达到端口复用。比如select模型,这种通信模型3大主流系统都支持,更高级的通信模型更有linux的epoll,unix(mac)的kq,和windows的asio。
server = ServerSocketChannel.open(); selector = Selector.open(); server.socket().bind(new InetSocketAddress(Conf.SOCKPORT)); server.configureBlocking(false); server.register(selector, SelectionKey.OP_ACCEPT); while (selector.select() > 0) { Iterator<SelectionKey> selectKeyItr = selector.selectedKeys().iterator(); while (selectKeyItr.hasNext()) { SelectionKey curKey = selectKeyItr.next(); selectKeyItr.remove(); if (curKey.isAcceptable()) { ServerSocketChannel ssc = (ServerSocketChannel) curKey.channel(); SocketChannel sc = ssc.accept(); sc.configureBlocking(false); sc.register(selector, SelectionKey.OP_READ); logger.info("Access:" + sc.socket().getInetAddress().getHostAddress()); } if (curKey.isReadable()) { SocketChannel sc = (SocketChannel) curKey.channel(); ByteBuffer buffer = ByteBuffer.allocate(max_buf); try { int i = sc.read(buffer); if (i == -1) { sc.close(); } // buffer.clear(); buffer.flip(); String line = decoder.decode(buffer).toString(); logger.info("Access from " + sc.socket().getInetAddress().getHostAddress() + ":" + line); String result = Dispatcher.parse(line); buffer = encoder.encode(CharBuffer.wrap(result + Conf.LINE)); sc.write(buffer); // sc.close(); } catch (IOException e) { // e.printStackTrace(); sc.close(); } } } }
以上是select通信模型的核心片断,我没有加注释,关于select可以看看资料关于操作系统通信层面的资料。如果你也使用java,有现成的框架对select封装过的api,比如netty和mina。2014年6月22日 15:29
相关推荐
本文将详细介绍如何通过Socket通讯实现文件共享设置,包括必要的系统配置、网络协议安装以及共享访问优化等关键步骤。 #### 二、重要设置概览 根据给定的内容,本文主要分为以下几个部分进行详细介绍: 1. **...
基于TCP/IP Socket通信的WINCC监控C客户端实现:局域消息共享传递系统,WINCC监控,WINCC的C脚本实现客户端。 通过TCP IP实现,socket通信 服务器使用C语言实现。 测试登录200台客户机, 因为不能多开wincc,所以使用...
2. **客户端实现**:在渲染进程中,使用以下步骤实现屏幕共享: - 引入`navigator.mediaDevices.getUserMedia`,并请求屏幕流。 - 用户同意后,获取到的屏幕流可以通过`RTCPeerConnection`创建一个offer,并发送给...
在Java中,`java.net.Socket`类和`java.net.ServerSocket`类是实现Socket通信的基础。`ServerSocket`用于监听和接受客户端的连接请求,`Socket`则代表一个实际的连接,通过它们的输入输出流进行数据传输。 在多...
Delphi 环境下用 Socket 实现 Web 服务器 Delphi环境下用Socket实现Web服务器是指在Delphi集成开发环境...Delphi 环境下用 Socket 实现 Web 服务器是一种灵活、可靠、高效的技术,可以满足各种信息发布和共享的需求。
基于TCP/IP Socket通信的WINCC监控C客户端实现:局域消息共享传递系统,基于TCP/IP的Socket通信实现WinCC监控的C客户端消息共享测试与监控,局域网内高效消息传递,WINCC监控,WINCC的C脚本实现客户端。 通过TCP IP...
在Linux系统中,实现基于Socket的多进程实时通信是一项重要的技术,它允许不同的进程间高效地交换数据。本文将详细介绍如何创建一个通信服务器(server)来作为中介,处理多个客户端(client)的连接和通信请求。 ...
在Windows中,可以通过WSAAsyncSelect()函数或Select模型实现SOCKET的异步通信。异步选择机制为SOCKET通信提供了非阻塞的处理方式,通过消息驱动机制将网络事件通知给应用程序。 组广播技术允许SOCKET向网络中的一...
实现桌面共享,关键在于创建一个服务器端应用,用于接收和广播共享的桌面图像数据,以及一个客户端应用,用于连接服务器并接收并显示这些图像。 1. **Socket编程**:在JAVA中,Socket是实现网络通信的基础。服务器...
在局域网内实现文件共享功能,Python提供了多种方法,其中最基础的是使用内置的`sockets`模块。本篇文章将详细探讨如何使用Python的sockets模块来创建一个简单的局域网文件共享系统。 首先,我们要了解局域网文件...
在本项目中,“QT实现的基于TCP Socket的共享白板”是一个利用QT库构建的、通过TCP Socket进行通信的多人协作工具。下面将详细介绍QT库、TCP Socket以及共享白板的相关知识点。 1. QT库: - QT库提供了一整套的C++...
Socket编程是实现计算机间通信的一种基本技术,它允许两台机器通过网络交换数据。本篇将深入讲解如何利用Java的Socket库实现双机通信,包括发送消息和传输文件。 首先,Java中的Socket类代表了网络上的一个端点,而...
本文将深入探讨如何使用C#语言实现一个基于TCP/IP协议的多线程Socket聊天室。这个聊天室功能允许局域网内的多台计算机进行实时信息交互,虽然没有在广域网环境下测试,但在局域网内能有效工作。 首先,我们要理解...
总之,这个项目通过Socket技术实现了类似于Windows资源管理器的文件共享系统,不仅展示了网络通信的基本概念,还涵盖了文件操作、进度显示、用户界面设计等多个IT知识点,对于学习网络编程和软件开发的人来说是一个...
在移动开发和物联网领域,蓝牙Socket通信被广泛应用于设备配对、文件传输、传感器数据共享等场景。本资源提供了一个便捷的开发库,简化了蓝牙socket连接的实现过程,加速了应用的开发速度。 首先,我们要理解蓝牙...
要实现Web服务器和Socket服务器之间的通信,你可以创建一个共享的数据结构,如全局变量或队列,两者都可以访问。例如,Web服务器接收到一个HTTP请求,处理后将数据放入队列,Socket服务器定期检查队列并发送数据给...
共享内存在两个进程间共享的方式可以通过 1. 文件命名式的内存共享, 容易造成安全问题,会被第三方读取 ...3. 通过socket 进行内存句柄的传递, 避免第三者获取 这里介绍的就是3方式进行共享内存在进程间的句柄共享
在实际应用中,你可能还需要处理错误、设置过滤器以仅接收特定ID的帧,或者与其他进程共享socket等。理解CAN的帧结构和协议规范(如CAN 2.0A、CAN 2.0B或CAN FD)也非常重要。通过这种方式,你可以在Linux下构建自己...
1、运用多线程和Socket技术实现Socket Server端侦听多个客户端请求; 2、实现服务器端循环处理客户端不同请求从而实现不同测试要求,并向客户端循环发送数据; 3、实现客户端向服务器端发送不同测试命令,并接收...
总结来说,Linux下的多线程并发通信基于socket实现,结合TCP/IP协议,能够高效地处理多个客户端的并发请求。开发者需要理解套接字的概念、类型以及编程原理,同时掌握多线程编程技巧,包括线程安全、线程池等,以...