网上有比较多的服务端非阻塞的nio示例代码。
但客户端基本全是阻塞的。
而我却需要一个非阻塞的客户端(所谓非阻塞关键在于读数据。下面的代码却没有关心读,如果你需要则加上对read感兴趣,之后代码结构还要再修改下)。
下面这个代码主要是看我的电脑最大能打开多少socket客户端(16000多个)。
import java.io.*; import java.net.*; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.SocketChannel; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class TalkClient implements Runnable { // public static List<Socket> socketList=new ArrayList<Socket>(); // public static List<OutputStream> outputList=new ArrayList<OutputStream>(); public static List<SocketChannel> socketList=new ArrayList<SocketChannel>(); public static void main(String[] args) throws InterruptedException, IOException { int clientNum=0; //打开一个选择器 Selector sel = Selector.open(); new Thread(new TalkClient()).start();//写线程 for (int i = 0; i < 100000; i++) { try{ /*//阻塞模式 Socket socket = new Socket("192.168.1.106", 9000); OutputStream out = socket.getOutputStream(); clientNum++; System.out.println("clientNum:"+clientNum); Thread.sleep(80); socketList.add(socket); outputList.add(out); */ //非阻塞模式 //打开套接字通道 SocketChannel socketChannel = SocketChannel.open(); socketChannel.configureBlocking(false); SocketAddress socketAddress = new InetSocketAddress("192.168.1.106", 9000); socketChannel.register(sel,SelectionKey.OP_CONNECT);//关心是否可以进行finishConnect操作 //返回false,必须在稍后使用finishConnect()真正建立连接 socketChannel.connect(socketAddress); //选择通道上注册的事件,其相应通道已为I/O操作准备就绪 int num=sel.select(); while(num>=0){ if(num>0){ //返回选择器的已选择键集 Iterator<SelectionKey> it = sel.selectedKeys().iterator(); //获取通道的选择器的键 SelectionKey key = it.next(); it.remove(); //如果该通道已经准备好套接字连接 if(key.isConnectable()){ SocketChannel c=(SocketChannel)key.channel(); //真正建立连接 c.finishConnect(); clientNum++; socketList.add(c); break; } } num=sel.select(); } System.out.println("clientNum:"+clientNum); Thread.sleep(80); } catch (Exception e) { e.printStackTrace(); break; } } } @Override public void run() { while(true){ try { // for (int i = 0;i< outputList.size(); i++) { // OutputStream out=outputList.get(i); // out.write("hello".getBytes()); // Thread.sleep(100); // } for (int i = 0;i< socketList.size(); i++) { SocketChannel socketChannel=socketList.get(i); socketChannel.write(ByteBuffer.wrap("hello".getBytes())); Thread.sleep(100); } Thread.sleep(5000); } catch (Exception e) { System.out.println("Error" + e); // 出错,则打印出错信息 } } } }
相关推荐
这会阻塞直到有客户端连接。 3. 当一个客户端连接后,`accept()`方法返回一个新的`Socket`对象,表示这个特定的客户端连接。 4. 通过`Socket`对象的`getInputStream()`和`getOutputStream()`方法获取输入流和输出流...
在Android中,我们可以使用java.net.Socket类来创建TCP客户端。 1. **创建Socket实例**: 在Android应用中,首先需要创建一个Socket实例,指定服务器的IP地址和端口号。这通常在主线程之外的线程(如AsyncTask或...
在这个示例中,我们将探讨如何利用C#语言进行简单的客户端-服务器通信。 【描述】"简单的SOCKECT程序示例"特别适合初学者,它提供了一个直观的起点,帮助理解套接字的工作原理。下载并分析这个示例,你可以看到它...
最近接了一个单子,QT写的多线程Socket服务器+多客户端,虽然用qt做socket服务器不太合适,但是毕竟客户要求就做了,本以为很简单,后来才发现QT的QTcpServer真的不太好用,参考了好多网上的教程才弄明白,顺便记录...
这是一个java程序实现的多线程聊天程序,该程序是基本sokect实现的。
window桌面端工具,支持: 1. 作为客户端连接Socket服务端 2. 向服务端发送文本数据 3. 接收服务端文本数据
通过这个Java Socket聊天项目的实践,我们可以掌握Java网络编程的基本技能,理解客户端和服务端的交互过程,为后续更复杂的网络应用开发打下坚实的基础。无论是文件传输、游戏对战还是分布式系统,Socket都是关键的...
这使得服务器可以同时处理多个客户端的请求,而不会阻塞其他用户。通过实现`Runnable`接口或继承`Thread`类,我们可以创建自定义的线程类,包含特定的业务逻辑。 其次,Socket编程是实现客户端和服务器间通信的关键...
1. **创建Socket对象**:在客户端,使用`java.net.Socket`类创建一个Socket实例,指定服务器的IP地址和端口号。 2. **建立连接**:调用`Socket`对象的`connect()`方法,向服务器发起连接请求。 3. **数据传输**:...
在探讨如何使用Java NIO实现Socket通信之前,我们需要先理解NIO(Non-blocking I/O,非阻塞I/O)与传统阻塞I/O之间的区别。 **传统阻塞I/O模型**:在传统的Java IO编程中,当我们调用`read()`或`write()`方法时,...
这种模式下,客户端和服务器端可以实时交换消息,且不会因为网络I/O操作阻塞用户界面,为用户提供流畅的交互体验。在实际开发中,还需要考虑更多细节,如安全性、性能优化以及用户体验等,但以上基础已经为我们构建...
一旦有客户端尝试连接,`accept()`方法会阻塞直到连接建立,然后返回一个新的`Socket`对象,用于与该客户端的通信: ```java Socket clientSocket = serverSocket.accept(); ``` 在客户端,我们需要创建一个`...
标题中的“GPS定位器GT06协议socket通讯JAVA源代码”揭示了本次讨论的主要内容,即使用Java编程语言实现GPS定位器(型号为GT06)的Socket通信协议。GPS定位器是用于获取地理位置信息的设备,而GT06协议是这种特定...
对于JAVA接口而言,通常会有一个客户端SDK(Software Development Kit),其中包括了必要的类库、示例代码以及API文档,用于指导开发者如何集成和使用这些功能。 在开发过程中,开发者首先需要理解SGIP(Short ...
以上就是关于“sokect通讯例子--广播”的核心内容。通过这个示例,开发者可以学习如何创建和管理Socket,以及如何使用UDP进行广播通信。在实际应用中,广播常用于设备发现、网络配置更新等场景。理解并熟练掌握...
Socket通讯实例是一个深入理解网络编程的关键环节,尤其是在IT行业中,Socket接口被广泛用于构建客户端-服务器应用程序,实现数据的高效传输。在这个实例中,我们将主要探讨Socket编程的基本概念、步骤以及在C/S...
在Java中,我们可以使用`java.net.Socket`和`java.net.ServerSocket`类来创建和管理Socket。客户端使用`Socket`类创建连接到服务器的实例,而服务器端则使用`ServerSocket`类监听传入的连接请求。 1. **服务器端...
在这个“Sokect简单通信聊天软件”中,包含了一个服务器端和一个客户端,它们通过Socket接口进行通信,实现了基本的聊天功能。下面我们将深入探讨Socket通信的核心概念、工作原理以及在聊天软件中的应用。 首先,...
- 当有客户端连接时,`Accept()`方法会阻塞,直到一个新的连接建立。返回的新Socket用于与该客户端进行通信。 - 接收到客户端数据后,可以使用`Receive()`或`BeginReceive()`方法读取。对于字符串数据,通常先接收...
demo实现了客户端和服务端相互发送消息,实现了client/services(cs)通信模型。