`
bnmnba
  • 浏览: 293618 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

java 非阻塞sokect客户端

 
阅读更多

网上有比较多的服务端非阻塞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); // 出错,则打印出错信息
	
			}
		}

	}

}

 

 

 

分享到:
评论

相关推荐

    java sokect

    这会阻塞直到有客户端连接。 3. 当一个客户端连接后,`accept()`方法返回一个新的`Socket`对象,表示这个特定的客户端连接。 4. 通过`Socket`对象的`getInputStream()`和`getOutputStream()`方法获取输入流和输出流...

    Android Wifi 局域网通信 TCP Client Sokect 客户端收发数据例程

    在Android中,我们可以使用java.net.Socket类来创建TCP客户端。 1. **创建Socket实例**: 在Android应用中,首先需要创建一个Socket实例,指定服务器的IP地址和端口号。这通常在主线程之外的线程(如AsyncTask或...

    简单的SOKECT示例程序

    在这个示例中,我们将探讨如何利用C#语言进行简单的客户端-服务器通信。 【描述】"简单的SOCKECT程序示例"特别适合初学者,它提供了一个直观的起点,帮助理解套接字的工作原理。下载并分析这个示例,你可以看到它...

    QT 多线程服务器客户端通信程序

    最近接了一个单子,QT写的多线程Socket服务器+多客户端,虽然用qt做socket服务器不太合适,但是毕竟客户要求就做了,本以为很简单,后来才发现QT的QTcpServer真的不太好用,参考了好多网上的教程才弄明白,顺便记录...

    java-Sokect.rar_java Soke_java sokect_java 多 聊天_java 聊天

    这是一个java程序实现的多线程聊天程序,该程序是基本sokect实现的。

    Sokect端口连接客户端

    window桌面端工具,支持: 1. 作为客户端连接Socket服务端 2. 向服务端发送文本数据 3. 接收服务端文本数据

    java sokect完整项目

    通过这个Java Socket聊天项目的实践,我们可以掌握Java网络编程的基本技能,理解客户端和服务端的交互过程,为后续更复杂的网络应用开发打下坚实的基础。无论是文件传输、游戏对战还是分布式系统,Socket都是关键的...

    Java 聊天室 Java 课程设计 Java毕业设计 多线程 sokect C/S模式

    这使得服务器可以同时处理多个客户端的请求,而不会阻塞其他用户。通过实现`Runnable`接口或继承`Thread`类,我们可以创建自定义的线程类,包含特定的业务逻辑。 其次,Socket编程是实现客户端和服务器间通信的关键...

    socket客户端长连接实现以及xml文件解析

    1. **创建Socket对象**:在客户端,使用`java.net.Socket`类创建一个Socket实例,指定服务器的IP地址和端口号。 2. **建立连接**:调用`Socket`对象的`connect()`方法,向服务器发起连接请求。 3. **数据传输**:...

    java nio 实现socket

    在探讨如何使用Java NIO实现Socket通信之前,我们需要先理解NIO(Non-blocking I/O,非阻塞I/O)与传统阻塞I/O之间的区别。 **传统阻塞I/O模型**:在传统的Java IO编程中,当我们调用`read()`或`write()`方法时,...

    C#Winform异步Sokect加多线程编程实现客户端服务器端聊天模式

    这种模式下,客户端和服务器端可以实时交换消息,且不会因为网络I/O操作阻塞用户界面,为用户提供流畅的交互体验。在实际开发中,还需要考虑更多细节,如安全性、性能优化以及用户体验等,但以上基础已经为我们构建...

    Socket回话---sokect编程

    一旦有客户端尝试连接,`accept()`方法会阻塞直到连接建立,然后返回一个新的`Socket`对象,用于与该客户端的通信: ```java Socket clientSocket = serverSocket.accept(); ``` 在客户端,我们需要创建一个`...

    GPS定位器GT06协议socket通讯JAVA源代码.zip

    标题中的“GPS定位器GT06协议socket通讯JAVA源代码”揭示了本次讨论的主要内容,即使用Java编程语言实现GPS定位器(型号为GT06)的Socket通信协议。GPS定位器是用于获取地理位置信息的设备,而GT06协议是这种特定...

    联通短信网关JAVA接口

    对于JAVA接口而言,通常会有一个客户端SDK(Software Development Kit),其中包括了必要的类库、示例代码以及API文档,用于指导开发者如何集成和使用这些功能。 在开发过程中,开发者首先需要理解SGIP(Short ...

    sokect通讯例子--广播

    以上就是关于“sokect通讯例子--广播”的核心内容。通过这个示例,开发者可以学习如何创建和管理Socket,以及如何使用UDP进行广播通信。在实际应用中,广播常用于设备发现、网络配置更新等场景。理解并熟练掌握...

    sokect通讯实例

    Socket通讯实例是一个深入理解网络编程的关键环节,尤其是在IT行业中,Socket接口被广泛用于构建客户端-服务器应用程序,实现数据的高效传输。在这个实例中,我们将主要探讨Socket编程的基本概念、步骤以及在C/S...

    利用socket连续发送与连续接收数据

    在Java中,我们可以使用`java.net.Socket`和`java.net.ServerSocket`类来创建和管理Socket。客户端使用`Socket`类创建连接到服务器的实例,而服务器端则使用`ServerSocket`类监听传入的连接请求。 1. **服务器端...

    Sokect简单通信聊天软件

    在这个“Sokect简单通信聊天软件”中,包含了一个服务器端和一个客户端,它们通过Socket接口进行通信,实现了基本的聊天功能。下面我们将深入探讨Socket通信的核心概念、工作原理以及在聊天软件中的应用。 首先,...

    sokect通信c#

    - 当有客户端连接时,`Accept()`方法会阻塞,直到一个新的连接建立。返回的新Socket用于与该客户端进行通信。 - 接收到客户端数据后,可以使用`Receive()`或`BeginReceive()`方法读取。对于字符串数据,通常先接收...

    java网络编程Socket(基础)demo

    demo实现了客户端和服务端相互发送消息,实现了client/services(cs)通信模型。

Global site tag (gtag.js) - Google Analytics