IO网络编程(二)

SPSS回归分析(线性:一元(简单)和多重;非线性logistic) SPSS线性回归分析回归分析一、线性模型(针对连续因变量,线性关系)(一)简单线性回归(一元线性回归)1、绘制散点图2、建立简单(一元)线性回归模型3、建立模型后,检查预测结果(二)多重回归分析1、绘制矩阵分布散点图(论文专用你懂的)2、建立多重回归模型point 1:自变量加入方法:逐步(步进)法3、建立模型后,检查预测结果二、非线性模型(将非线性问题转换为线性问题)1、logistic分析的回归模型1.1 建立回归模型1.2 利用回归模型进行预测 根据之前的学习,通过评价实验得到了主观数据, 通过 描述 阅读详情

NIO

简介

有人称之为 New I/O,因为它相对于之前的 I/O 类库是新增的,所以被称为 NewI/O,这是它的官方叫法。但是,由于之前老的 I/O 类库是阻塞 I/O,New I/O 类库的目标就是要让 Java 支持非阻塞 I/O,所以,更多的人喜欢称之为非阻塞 I/O(Non-block I/O),由于非阻塞 I/O 更能够体现 NIO 的特点,所以本文使用的NIO 都指的是非阻塞 I/O。IO是面向流的,NIO是面向缓冲区,面向块的。NIO相关的包都在java.nio包下,并且对原来java.io包中很多类进行了改写。
NIO有三大核心部分:Channel(通道),Buffer(缓冲区),Selector(选择器)
NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。
Channel
首先说一下Channel,国内大多翻译成“通道”。通道可以实现异步读写数据,可以从缓冲区读也可以写到缓冲区。Channel和IO中的Stream(流)是差不多一个等级的。只不过Stream是单向的,譬如:InputStream, OutputStream.而Channel是双向的,既可以用来进行读操作,又可以用来进行写操作。
NIO中的Channel的主要实现有:
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
这里看名字就可以猜出个所以然来:分别可以对应文件IO、UDP和TCP(Server和Client)。下面演示的案例基本上就是围绕这4个类型的Channel进行陈述的。
简单使用(以FileChannel为例):

//写入本地文件。
//str--->ByteBuffer--->NIOFileChannel(其实还是FileOutputStream )--->本地文件
public class NIOFileChannel {
    public static void main(String[] args) throws IOException {
        String str = "hello feng";
        FileOutputStream fileOutputStream = new FileOutputStream("d:\\file.txt");
        //通过fileOutputStream获取对应的FileChanne
        FileChannel fileChannel = fileOutputStream.getChannel();
        //创建一个缓冲区
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        //将str放入到byteBuffer
        byteBuffer.put(str.getBytes());
        //flip 切换
        byteBuffer.flip();
        //将byteBuffer写入到fileChannel
        fileChannel.write(byteBuffer);
        fileOutputStream.close();
    }
}

Buffer
NIO中的关键Buffer实现有:ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer,分别对应基本数据类型: byte, char, double, float, int, long, short。当然NIO中还有MappedByteBuffer, HeapByteBuffer, DirectByteBuffer等这里先不进行陈述。
三个重要属性:
1.capacity: 容量,Buffer中元素的个数,永远不能为负数,永远不会变化
2.limit: 限制,实际上它是Buffer所维护的那个数组中的一个下标,limit是第一个不能被读,或者第一个不能被写的元素的index,limit永远不会是负数,永远不会超过capacity
3.Position: 定位,指数组中下一个将要被读或者将要被写的元素的索引。

简单使用(以IntBuffer为例):

public class BasicBuffer {

    public static void main(String[] args) {

        IntBuffer allocate = IntBuffer.allocate(5);
        //向buffer中传数据
        for (int i = 0; i < allocate.capacity(); i++) {
            allocate.put(i * 2);
        }
        //从buffer取数据,读写切换
        allocate.flip();
        while (allocate.hasRemaining()){
            System.out.println(allocate.get());
        }
    }
}

Selector
Selector运行单线程处理多个Channel,如果你的应用打开了多个通道,但每个连接的流量都很低,使用Selector就会很方便。例如在一个聊天服务器中。要使用Selector, 得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新的连接进来、数据接收等。
channel,buffer,selector对应图
上图反应出Selector,Channel,Buffer之间的关系:
1.每个channel对应一个buffer
2.selector对应一个线程,一个线程对应多个channel(连接)
3.上图有三个channel注册到了selector
4.程序切换到哪个channel是由事件决定的,event是个重要概念
5.selector会根据不同事件,在各个通道上切换
6.buffer就是一个内存块,底层是一个数组
7.数据的读取写入是通过buffer,BIO中要么是输入流要么是输出流,不能双向,NIO中buffer既可以读又可以写,只不过需要flip切换
8.channel是双向的,可以返回底层操作系统情况。(linux底层通道就是双向的)

NIO Server端创建

服务端的主要步骤如下:

  1. 打开ServerSocketChannel,监听客户端连接
  2. 绑定监听端口,设置连接为非阻塞模式
  3. 创建Reactor线程,创建多路复用器并启动线程
  4. 将ServerSocketChannel注册到Reactor线程中的Selector上,监听ACCEPT事件
  5. Selector轮询准备就绪的key
  6. Selector监听到新的客户端接入,处理新的接入请求,完成TCP三次握手,简历物理链路
  7. 设置客户端链路为非阻塞模式
  8. 将新接入的客户端连接注册到Reactor线程的Selector上,监听读操作,读取客户端发送的网络消息
  9. 异步读取客户端消息到缓冲区
  10. 对Buffer编解码,处理半包消息,将解码成功的消息封装成Task
  11. 将应答消息编码为Buffer,调用SocketChannel的write将消息异步发送给客户端

NIO创建的Server:

public class Server {
	private static int DEFAULT_PORT = 8888;
	private static ServerHandle serverHandle;
	public static void start(){
		start(DEFAULT_PORT);
	}
	public static synchronized void start(int port){
		if(serverHandle!=null)
			serverHandle.stop();
		serverHandle = new ServerHandle(port);
		new Thread(serverHandle,"Server").start();
	}
	public static void main(String[] args){
		start();
	}
}

ServerHandle:


public class ServerHandle implements Runnable{
	private Selector selector;
	private ServerSocketChannel serverChannel;
	private volatile boolean started;
	/**
	 * 构造方法
	 * @param port 指定要监听的端口号
	 */
	public ServerHandle(int port) {
		try{
			//创建选择器
			selector = Selector.open();
			//打开监听通道
			serverChannel = ServerSocketChannel.open();
			//如果为 true,则此通道将被置于阻塞模式;如果为 false,则此通道将被置于非阻塞模式
			serverChannel.configureBlocking(false);//开启非阻塞模式
			//绑定端口 backlog设为1024
			serverChannel.socket().bind(new InetSocketAddress(port),1024);
			//监听客户端连接请求
			serverChannel.register(selector, SelectionKey.OP_ACCEPT);
			//标记服务器已开启
			started = true;
			System.out.println("服务器已启动,端口号:" + port);
		}catch(IOException e){
			e.printStackTrace();
			System.exit(1);
		}
	}
	public void stop(){
		started = false;
	}
	@Override
	public void run() {
		//循环遍历selector
		while(started){
			try{
				//无论是否有读写事件发生,selector每隔1s被唤醒一次
				selector.select(1000);
				//阻塞,只有当至少一个注册的事件发生的时候才会继续.
//				selector.select();
				Set<SelectionKey> keys = selector.selectedKeys();
				Iterator<SelectionKey> it = keys.iterator();
				SelectionKey key = null;
				while(it.hasNext()){
					key = it.next();
					it.remove();
					try{
						handleInput(key);
					}catch(Exception e){
						if(key != null){
							key.cancel();
							if(key.channel() != null){
								key.channel().close();
							}
						}
					}
				}
			}catch(Throwable t){
				t.printStackTrace();
			}
		}
		//selector关闭后会自动释放里面管理的资源
		if(selector != null)
			try{
				selector.close();
			}catch (Exception e) {
				e.printStackTrace();
			}
	}
	private void handleInput(SelectionKey key) throws IOException{
		if(key.isValid()){
			//处理新接入的请求消息
			if(key.isAcceptable()){
				ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
				//通过ServerSocketChannel的accept创建SocketChannel实例
				//完成该操作意味着完成TCP三次握手,TCP物理链路正式建立
				SocketChannel sc = ssc.accept();
				//设置为非阻塞的
				sc.configureBlocking(false);
				//注册为读
				sc.register(selector, SelectionKey.OP_READ);
			}
			//读消息
			if(key.isReadable()){
				SocketChannel sc = (SocketChannel) key.channel();
				//创建ByteBuffer,并开辟一个1M的缓冲区
				ByteBuffer buffer = ByteBuffer.allocate(1024);
				//读取请求码流,返回读取到的字节数
				int readBytes = sc.read(buffer);
				//读取到字节,对字节进行编解码
				if(readBytes>0){
					//将缓冲区当前的limit设置为position=0,用于后续对缓冲区的读取操作
					buffer.flip();
					//根据缓冲区可读字节数创建字节数组
					byte[] bytes = new byte[buffer.remaining()];
					//将缓冲区可读字节数组复制到新建的数组中
					buffer.get(bytes);
					String expression = new String(bytes,"UTF-8");
					System.out.println("服务器收到消息:" + expression);
					//处理数据
					String result = null;
					try{
						result = Calculator.cal(expression).toString();
					}catch(Exception e){
						result = "计算错误:" + e.getMessage();
					}
					//发送应答消息
					doWrite(sc,result);
				}
				//没有读取到字节 忽略
//				else if(readBytes==0);
				//链路已经关闭,释放资源
				else if(readBytes<0){
					key.cancel();
					sc.close();
				}
			}
		}
	}
	//异步发送应答消息
	private void doWrite(SocketChannel channel,String response) throws IOException{
		//将消息编码为字节数组
		byte[] bytes = response.getBytes();
		//根据数组容量创建ByteBuffer
		ByteBuffer writeBuffer = ByteBuffer.allocate(bytes.length);
		//将字节数组复制到缓冲区
		writeBuffer.put(bytes);
		//flip操作
		writeBuffer.flip();
		//发送缓冲区的字节数组
		channel.write(writeBuffer);
		//****此处不含处理“写半包”的代码
	}
}

NIO Client端创建

NIO创建的Client :


public class Client {
	private static String DEFAULT_HOST = "127.0.0.1";
	private static int DEFAULT_PORT = 8888;
	private static ClientHandle clientHandle;
	public static void start(){
		start(DEFAULT_HOST,DEFAULT_PORT);
	}
	public static synchronized void start(String ip,int port){
		if(clientHandle!=null)
			clientHandle.stop();
		clientHandle = new ClientHandle(ip,port);
		new Thread(clientHandle,"Server").start();
	}
	//向服务器发送消息
	public static boolean sendMsg(String msg) throws Exception{
		if(msg.equals("q")) return false;
		clientHandle.sendMsg(msg);
		return true;
	}
	public static void main(String[] args){
		start();
	}
}

ClientHandle :

public class ClientHandle implements Runnable{
	private String host;
	private int port;
	private Selector selector;
	private SocketChannel socketChannel;
	private volatile boolean started;
 
	public ClientHandle(String ip,int port) {
		this.host = ip;
		this.port = port;
		try{
			//创建选择器
			selector = Selector.open();
			//打开监听通道
			socketChannel = SocketChannel.open();
			//如果为 true,则此通道将被置于阻塞模式;如果为 false,则此通道将被置于非阻塞模式
			socketChannel.configureBlocking(false);//开启非阻塞模式
			started = true;
		}catch(IOException e){
			e.printStackTrace();
			System.exit(1);
		}
	}
	public void stop(){
		started = false;
	}
	@Override
	public void run() {
		try{
			doConnect();
		}catch(IOException e){
			e.printStackTrace();
			System.exit(1);
		}
		//循环遍历selector
		while(started){
			try{
				//无论是否有读写事件发生,selector每隔1s被唤醒一次
				selector.select(1000);
				//阻塞,只有当至少一个注册的事件发生的时候才会继续.
//				selector.select();
				Set<SelectionKey> keys = selector.selectedKeys();
				Iterator<SelectionKey> it = keys.iterator();
				SelectionKey key = null;
				while(it.hasNext()){
					key = it.next();
					it.remove();
					try{
						handleInput(key);
					}catch(Exception e){
						if(key != null){
							key.cancel();
							if(key.channel() != null){
								key.channel().close();
							}
						}
					}
				}
			}catch(Exception e){
				e.printStackTrace();
				System.exit(1);
			}
		}
		//selector关闭后会自动释放里面管理的资源
		if(selector != null)
			try{
				selector.close();
			}catch (Exception e) {
				e.printStackTrace();
			}
	}
	private void handleInput(SelectionKey key) throws IOException{
		if(key.isValid()){
			SocketChannel sc = (SocketChannel) key.channel();
			if(key.isConnectable()){
				if(sc.finishConnect());
				else System.exit(1);
			}
			//读消息
			if(key.isReadable()){
				//创建ByteBuffer,并开辟一个1M的缓冲区
				ByteBuffer buffer = ByteBuffer.allocate(1024);
				//读取请求码流,返回读取到的字节数
				int readBytes = sc.read(buffer);
				//读取到字节,对字节进行编解码
				if(readBytes>0){
					//将缓冲区当前的limit设置为position=0,用于后续对缓冲区的读取操作
					buffer.flip();
					//根据缓冲区可读字节数创建字节数组
					byte[] bytes = new byte[buffer.remaining()];
					//将缓冲区可读字节数组复制到新建的数组中
					buffer.get(bytes);
					String result = new String(bytes,"UTF-8");
					System.out.println("客户端收到消息:" + result);
				}
				//没有读取到字节 忽略
//				else if(readBytes==0);
				//链路已经关闭,释放资源
				else if(readBytes<0){
					key.cancel();
					sc.close();
				}
			}
		}
	}
	//异步发送消息
	private void doWrite(SocketChannel channel,String request) throws IOException{
		//将消息编码为字节数组
		byte[] bytes = request.getBytes();
		//根据数组容量创建ByteBuffer
		ByteBuffer writeBuffer = ByteBuffer.allocate(bytes.length);
		//将字节数组复制到缓冲区
		writeBuffer.put(bytes);
		//flip操作
		writeBuffer.flip();
		//发送缓冲区的字节数组
		channel.write(writeBuffer);
		//****此处不含处理“写半包”的代码
	}
	private void doConnect() throws IOException{
		if(socketChannel.connect(new InetSocketAddress(host,port)));
		else socketChannel.register(selector, SelectionKey.OP_CONNECT);
	}
	public void sendMsg(String msg) throws Exception{
		socketChannel.register(selector, SelectionKey.OP_READ);
		doWrite(socketChannel, msg);
	}
}

参考资料:
Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码

国产上位机软件突围:适配统信UOS/麒麟OS的跨平台开发技术与实践(2026年信创实战指南) (航天科技集团CTO):“在信创战场上,1ms的延迟意味着1个卫星的控制失效。2026年,C#/.NET MAUI不是选择,而是我们守护卫星的‘生命线’。 阅读详情

相关推荐

FPGA上的YOLOv8加速实现:从Verilog到高层综合

YOLOv8 采用了更高效的C2f模块与轻量化Backbone结构,模型特征包括:结构紧凑、检测头融合高低层特征;支持Anchor-free检测机制;支持INT8、FP16低精度推理;计算密度高,适合FPGA并行优化。

2501_93174773的博客 917

Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

本文会从传统的BIO到NIO再到AIO自浅至深介绍,并附上完整的代码讲解。 1、BIO编程 1.1、传统的BIO编程 网络编程的基本模型是C/S模型,即两个进程间的通信。 服务端提供IP和监听端口,客户端通过连接操作想服务端监听的地址发起连接请求,通过三次握手连接,如果连接成功建立,双方就可以通过套接字进行通信。 传统的同步阻塞模型开发中,ServerSocket负责绑定IP地址,启动监听端口;Socket负责发起连接操作。连接成功后,双方通过输入和输出流进行同步阻塞式通信。

anxpp的博客 17万+

LC整流滤波电路DIY:电感电容配合,手把手搭建低纹波直流电源

在直流电源设计中,整流滤波是连接交流输入与稳定输出的关键环节。常见的电容滤波虽然简单,但在大负载下纹波抑制能力有限,电感抵抗电流突变、电容抵抗电压突变,二者组合构成的LC滤波能有效降低输出电压纹波,同时减小开机浪涌电流。在工频线性电源、功放电源等对噪声敏感的场景中,LC滤波常作为稳压前的平滑缓冲。本文以一套完整DIY项目为线索,介绍整流桥后串联功率电感、并联滤波电容的电路构成,结合实际计算与波形测试,讨论电感量估算、电容选取、谐振风险、饱和电流等工程问题,并给出上电测试和故障排查方法。通过搭建与调试,可直观

weixin_29168813的博客 375

网络编程(二、IO模型)

上一节我们讲了客户端的编程(现在还没有,之后加上),客户端编程比较简单,fd就只有一个,但是服务器会连接很多个客户端,所以服务器对客户端发送过来的请求(IO操作),做了一个总结,一共有5种,接下来我们就好好分析分析。

酱油师兄的博客 603

浙江大学Fast-Lab从0制作自主空中机器人公开课教程补充及部分注意事项(适用于ubuntu系统和ROS零基础)

浙江大学Fast-Lab从0制作自主空中机器人公开课纯萌新补充(适用于从没接触过ubuntu系统),记录了一些自己不会的地方以及踩过的坑

qq_39986834的博客 2984

新华硕笔记本ubuntu18.04双系统安装之后,wifi没有显示无法链接wifi

本来我以为跟简单安装一个wifi网卡的驱动就可以解决的问题,没想到花了我一早上的时候解决… 惭愧。 另外,本来是没打算写这篇博客的,但是我在搜索解决这个问题的过程中, 发现多人提出的解决方案跟我的都不一样,甚至我的解决方案都没有搜到相应的答案,还是只能靠自己啊。。 言归正传,还是说说怎么正确的安装wifi驱动吧! 1. wifi没有正确安装、或没有正确配置的表现 我的电脑现象: 有wifi图标, wifi设置上显示unaviable,无法搜索到任何wifi; 还有其他类似的表现,大家可以看看其他朋友的提

Ian的博客 1889

网络编程二-LINUX网络IO模型

目录 前言:网络编程里通用常识 一、同步和异步与阻塞和非阻塞 同步和异步 阻塞和非阻塞 两者的组合 二、五种I/O模型 阻塞I/O模型 非阻塞IO模型 IO复用模型 信号驱动IO 异步IO模型 5个I/O模型的比较 今天台风利奇马就要登陆浙江了,风那叫一个大啊,所以,就别出门了,老老实实在家学习看博客吧哈O(∩_∩)O 前言:网络编程里通用常识 既然是网络编程肯定是...

b379685397的博客 3万+

C#粘包和分包问题及解决方法

一:通过图解法来描述一下分包和粘包,这样客户更清晰直观的了解:  下面对上面的图进行解释:  1.正常情况:如果Socket Client 发送的数据包,在Socket Server端也是一个一个完整接收的,那个就不会出现粘包和分包情况,数据正常读取。  2.粘包情况:Socket Client发送的数据包,在客户端发送和服务器接收的情况下都有可能发送,因为客户端发送的数据都是发送的一个缓冲...

weixin_42033401的博客 7767

C++网络编程之IO多路复用(二)

在上一篇文章中,我们介绍了如何使用select进行IO多路复用。虽然select在很多场景下非常有用,但它存在线性扫描、复制文件描述符集合、不支持边缘触发模式、信号干扰等众多问题。因此,在更高效的IO多路复用方案中,往往会选择poll和epoll。在本篇中,我们将重点介绍poll,下一篇将介绍epoll。

hope_wisdom的技术博客 1703

【信息系统项目管理师】高分论文:论信息系统项目的整合管理(绩效考核系统)

我们将项目管理计划中的子计划包括项目范围、进度、成本、质量管理计划,过程改进计划,人力资源管理计划,风险、采购管理计划,干系人管理计划,项目范围、成本、进度基准作为依据,查看项目的各个方面,通过组织全体团体成员会议来解读由各监控过程提供的信息,之后我与项目管理团队一起制订所需措施,确保项目绩效达到预期要求。在一个项目中,变更是必然的,也是不可避免的,进度拖延,成本失控,客户有新的需求等都会引起项目的变更。在本项目中,我要求有处于工作状态的产品,开发人员才可以对其任意修改,修改完成后,重新入库即可。

数据知道的博客 6886

AI技术在电商中的实际应用

人工智能、电商、推荐系统、个性化、机器学习、深度学习 1. 背景介绍 电子商务行业近年来发展迅速,用户数量不断增长,商品种类日益丰富。然而,随着市场竞争的加剧,电商平台面临着如何提升用户体验、提高转化率、挖掘潜在商机等一系列挑战。人工智能(AI)技术作为一种新兴技术,凭借其强大的数

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 1740

JAVA编程思想进阶(二)IO流,网络编程,

程序就是对象的集合。

hands_up_down的博客 1772

【软件定义汽车】-【架构篇】-全面讲解整车电子电气架构演进

前言: 前段时间,陆陆续续写了一些电子电气架构相关的文章。这里打算再写最后一篇作为收尾,为整个系列画上句号,把坑填上,这个话题就算过去了。后续一段时间,尽量把之前文章中挖的“坑”填一下。行文逻辑将借鉴5W2H进行。 另外,本文作为一篇整合性的文章,为保证逻辑的完整性,主要是将大量过去自己文章中的内容进行梳理整合,也存在很多行业内专家的公开文章的内容,请见谅。 WHAT1:什么是汽车电子电气架构? 电子电气架构:EEA,Electrical/Electronic Architecture.

零点壹客的博客 1万+

android 网络编程(二、IO流)

初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂。而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见。 首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!)   这是java io 比较基本的一些处理流,除此之外我们还会提到一些比

gaoyong0624的专栏 644

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

网络编程二-LINUX网络IO模型(2)

综上,在选择select,poll,epoll时要根据具体的使用场合以及这三种方式的自身特点。1、表面上看epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调。2、select低效是因为每次它都需要轮询。但低效也是相对的,视情况而定,也可通过良好的设计改善。

m0_60229361的博客 916

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

python 网络编程(二):IO 多路复用

主要介绍 python 网络编程中的 IO 复用中的 select 和 epoll

AlexWoo0501的博客 1887

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

深入linux网络编程(二):异步阻塞IO —— select

作者:yurunsun@gmail.com 新浪微博@孙雨润 新浪博客 优快云博客日期:2012年11月17日 <!-- body {font-size:14px; line-height:1.6; color:#333333; font:13px/1.4 Helvetica,arial,freesans,clean,sans-serif} body > *:f

雨润的技术博客 5488

网络编程二:UDP通信过程+非阻塞IO属性

1、UDP协议中由于不需要连接,所以不能使用accept/connect函数。2、UDP中是如何知道对方的地址???

m0_53809203的博客 1330

深入linux网络编程(二):异步阻塞IO

From: http://www.cfanz.cn/index.php?c=article&a=read&id=30027 作者:yurunsun@gmail.com 新浪微博@孙雨润 新浪博客 优快云博客日期:2012年11月17日 1. 异步阻塞IO 当从一个描述符读,写到另一个描述符时,可以在下列形式的循环中使用阻塞IO: while ((n = read(

Game Developer 587

计算机网络(二)POSIX网络编程接口、网络IO模型、TCPserver搭建、epoll、reactor

title: 计算机网络(二)Linux网络编程description: 计算机网络(二)Linux网络编程tag: 计算机网络。

芸兮的博客 1万+

Linux非阻塞IO(二)网络编程中非阻塞IO与IO复用模型结合

上文描述了最简易的非阻塞IO,采用的是轮询的方式,这节我们使用IO复用模型。 阻塞IO 过去我们使用IO复用与阻塞IO结合的时候,IO复用模型起到的作用是并发监听多个fd。 以简单的回射服务器为例,我们只监听了某fd是否可读,一旦fd有数据,我们立刻read,然后将其write给对方。 在阻塞IO里面,我们总是认为fd是可写的。因为即使底层的IO缓冲区已满,稍微等待片刻即可。这...

weixin_34410662的博客 89

java基础知识②:多线程编程、IO流和网络编程、泛型、集合框架

多线程编程、IO流和网络编程、泛型、集合框架

两点 1916

深入Linux网络编程(二):异步阻塞IO—select

异步阻塞IO—select 1. 异步阻塞IO 当从一个描述符读,写到另一个描述符时,可以在下列形式的循环中使用阻塞IO: while ((n = read(STDIN_FILENO, buf, BUFSIZ)) > 0) if (write(STDOUT_FILENO, buf, n) != n) err_sys("write error");

ljmwork的专栏 642

网络编程(二):一请求一线程&多线程网络io

推荐一本讲网络编程的书:《TCP/IP网络编程》(尹圣雨)1. 什么是 socket_操作系统中的socket库-优快云博客2. socket 的具体实现_socket内核实现-优快云博客这段代码实现了一个多线程TCP回显服务器监听端口:在 2000 端口接受客户端连接。多线程处理:每个客户端连接由一个独立线程处理。回显数据:将客户端发送的数据原样返回(如客户端发送 "Hello",服务器返回 "Hello")。这篇文章先讲解了网络编程中最核心的socket。

qq_75158598的博客 334

java基础(二)并发编程、IO流、网络编程

并发编程 1.进程和线程 进程:PC机上面正在运行的某个程序; 线程:进程中程序的一个执行过程;一个进程中至少有一个线程; 多线程:实现方式 继承 Thread 类 实现 Runnable 接口 无论什么方式实现:都必须重写 run方法; 如果要作为独立的线程来启动不是调用run()方法, 而是调用start()方法; Thread.currentThread() 该方法获得线程...

GQ_YIN日常记录 747

Java网络编程(二) —— 网络IO模型及同步异步、阻塞非阻塞最通俗讲解

文章目录1. 烧水举例同步和异步:阻塞和非阻塞:2. Unix网络IO模型1. 阻塞IO模型:2. 非阻塞IO模型I/O复用模型信号驱动式I/O异步IO模型 参考文章 https://www.zhihu.com/question/19732473 https://juejin.im/entry/5a72d7f36fb9a01ca8724e36 1. 烧水举例 用生活中最常见的煮开水举例。出场人物:...

Charles Ren's Tech Blog 1099
上一篇: Java注入的奇怪问题
下一篇: IO网络编程(三)
CodersCoder
博客等级 码龄10年 90粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值