0 0

如何实现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个答案 按时间排序 按投票排序

0 0

采纳的答案

这种情况下,你不应该再使用阻塞式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通讯的文件共享设置

    本文将详细介绍如何通过Socket通讯实现文件共享设置,包括必要的系统配置、网络协议安装以及共享访问优化等关键步骤。 #### 二、重要设置概览 根据给定的内容,本文主要分为以下几个部分进行详细介绍: 1. **...

    基于TCP/IP Socket通信的WINCC监控C客户端实现:局域消息共享传递系统,WINCC监控,WINCC的C脚本实现客户端 通过TCP IP实现,socket通信 服务器使用C语言实现 测

    基于TCP/IP Socket通信的WINCC监控C客户端实现:局域消息共享传递系统,WINCC监控,WINCC的C脚本实现客户端。 通过TCP IP实现,socket通信 服务器使用C语言实现。 测试登录200台客户机, 因为不能多开wincc,所以使用...

    Electrons实现Chrome使用WebRTC实现屏幕共享

    2. **客户端实现**:在渲染进程中,使用以下步骤实现屏幕共享: - 引入`navigator.mediaDevices.getUserMedia`,并请求屏幕流。 - 用户同意后,获取到的屏幕流可以通过`RTCPeerConnection`创建一个offer,并发送给...

    基于socket通信的javaDH通信实现

    在Java中,`java.net.Socket`类和`java.net.ServerSocket`类是实现Socket通信的基础。`ServerSocket`用于监听和接受客户端的连接请求,`Socket`则代表一个实际的连接,通过它们的输入输出流进行数据传输。 在多...

    Delphi环境下用Socket实现Web服务器[借鉴].pdf

    Delphi 环境下用 Socket 实现 Web 服务器 Delphi环境下用Socket实现Web服务器是指在Delphi集成开发环境...Delphi 环境下用 Socket 实现 Web 服务器是一种灵活、可靠、高效的技术,可以满足各种信息发布和共享的需求。

    基于TCP/IP Socket通信的WINCC监控C客户端实现:局域消息共享传递系统,基于TCP/IP的Socket通信实现WinCC监控的C客户端消息共享测试与监控,局域网内高效消息传递,WINCC

    基于TCP/IP Socket通信的WINCC监控C客户端实现:局域消息共享传递系统,基于TCP/IP的Socket通信实现WinCC监控的C客户端消息共享测试与监控,局域网内高效消息传递,WINCC监控,WINCC的C脚本实现客户端。 通过TCP IP...

    Linux上实现基于Socket_的多进程实时通信

    在Linux系统中,实现基于Socket的多进程实时通信是一项重要的技术,它允许不同的进程间高效地交换数据。本文将详细介绍如何创建一个通信服务器(server)来作为中介,处理多个客户端(client)的连接和通信请求。 ...

    应用SOCKET实现网络通信

    在Windows中,可以通过WSAAsyncSelect()函数或Select模型实现SOCKET的异步通信。异步选择机制为SOCKET通信提供了非阻塞的处理方式,通过消息驱动机制将网络事件通知给应用程序。 组广播技术允许SOCKET向网络中的一...

    JAVA实现局域网桌面共享

    实现桌面共享,关键在于创建一个服务器端应用,用于接收和广播共享的桌面图像数据,以及一个客户端应用,用于连接服务器并接收并显示这些图像。 1. **Socket编程**:在JAVA中,Socket是实现网络通信的基础。服务器...

    Python 实现局域网内文件共享功能

    在局域网内实现文件共享功能,Python提供了多种方法,其中最基础的是使用内置的`sockets`模块。本篇文章将详细探讨如何使用Python的sockets模块来创建一个简单的局域网文件共享系统。 首先,我们要了解局域网文件...

    QT实现的基于TCP Socket的共享白板.7z

    在本项目中,“QT实现的基于TCP Socket的共享白板”是一个利用QT库构建的、通过TCP Socket进行通信的多人协作工具。下面将详细介绍QT库、TCP Socket以及共享白板的相关知识点。 1. QT库: - QT库提供了一整套的C++...

    利用socket实现双机通信.

    Socket编程是实现计算机间通信的一种基本技术,它允许两台机器通过网络交换数据。本篇将深入讲解如何利用Java的Socket库实现双机通信,包括发送消息和传输文件。 首先,Java中的Socket类代表了网络上的一个端点,而...

    C#多线程与Socket聊天室的实现

    本文将深入探讨如何使用C#语言实现一个基于TCP/IP协议的多线程Socket聊天室。这个聊天室功能允许局域网内的多台计算机进行实时信息交互,虽然没有在广域网环境下测试,但在局域网内能有效工作。 首先,我们要理解...

    用基于Socket做的类似资源管理器的文件共享

    总之,这个项目通过Socket技术实现了类似于Windows资源管理器的文件共享系统,不仅展示了网络通信的基本概念,还涵盖了文件操作、进度显示、用户界面设计等多个IT知识点,对于学习网络编程和软件开发的人来说是一个...

    蓝牙socket通信.实现快速文件传输/快速开发

    在移动开发和物联网领域,蓝牙Socket通信被广泛应用于设备配对、文件传输、传感器数据共享等场景。本资源提供了一个便捷的开发库,简化了蓝牙socket连接的实现过程,加速了应用的开发速度。 首先,我们要理解蓝牙...

    Python Tornado实现WEB服务器Socket服务器共存并实现交互的方法

    要实现Web服务器和Socket服务器之间的通信,你可以创建一个共享的数据结构,如全局变量或队列,两者都可以访问。例如,Web服务器接收到一个HTTP请求,处理后将数据放入队列,Socket服务器定期检查队列并发送数据给...

    linux 下通过socket 传递共享内存句柄,实现共享内存操作

    共享内存在两个进程间共享的方式可以通过 1. 文件命名式的内存共享, 容易造成安全问题,会被第三方读取 ...3. 通过socket 进行内存句柄的传递, 避免第三者获取 这里介绍的就是3方式进行共享内存在进程间的句柄共享

    liunx下使用socket实现can总线数据接收

    在实际应用中,你可能还需要处理错误、设置过滤器以仅接收特定ID的帧,或者与其他进程共享socket等。理解CAN的帧结构和协议规范(如CAN 2.0A、CAN 2.0B或CAN FD)也非常重要。通过这种方式,你可以在Linux下构建自己...

    C Socket通信多线程数据双向收发实例VS2010(全部源码)

    1、运用多线程和Socket技术实现Socket Server端侦听多个客户端请求; 2、实现服务器端循环处理客户端不同请求从而实现不同测试要求,并向客户端循环发送数据; 3、实现客户端向服务器端发送不同测试命令,并接收...

    Linux下基于socket多线程并发通信的实现

    总结来说,Linux下的多线程并发通信基于socket实现,结合TCP/IP协议,能够高效地处理多个客户端的并发请求。开发者需要理解套接字的概念、类型以及编程原理,同时掌握多线程编程技巧,包括线程安全、线程池等,以...

Global site tag (gtag.js) - Google Analytics