网络编程

网络编程:Reactor与Proactor的概念

十年热恋 提交于 2019-12-07 20:08:31
1、标准定义 两种I/O多路复用模式:Reactor和Proactor 一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理器。两个与事件分离器有关的模式是Reactor和Proactor。Reactor模式采用同步IO,而Proactor采用异步IO。 在Reactor中,事件分离器负责等待文件描述符或socket为读写操作准备就绪,然后将就绪事件传递给对应的处理器,最后由处理器负责完成实际的读写工作。 而在Proactor模式中,处理器--或者兼任处理器的事件分离器,只负责发起异步读写操作。IO操作本身由操作系统来完成。传递给操作系统的参数需要包括用户定义的数据缓冲区地址和数据大小,操作系统才能从中得到写出操作所需数据,或写入从socket读到的数据。事件分离器捕获IO操作完成事件,然后将事件传递给对应处理器。比如,在windows上,处理器发起一个异步IO操作,再由事件分离器等待IOCompletion事件。典型的异步模式实现,都建立在操作系统支持异步API的基础之上,我们将这种实现称为“系统级”异步或“真”异步

Android网络编程概述

喜你入骨 提交于 2019-12-07 16:42:59
首先,应该了解的几个问题: 1)Android平台网络相关API接口 a) Java .net.*(标准Java接口) java.net.*提供与联网有关的类,包括流、数据包套接字(socket)、Internet协议、常见Http处理等。比如:创建URL,以及URLConnection/HttpURLConnection对象、设置链接参数、链接到服务器、向服务器写数据、从服务器读取数据等通信。这些在Java网络编程中均有涉及。 b) Org.apache接口 对于大部分应用程序而言JDK本身提供的网络功能已远远不够,这时就需要Android提供的Apache HttpClient了。它是一个开源项目,功能更加完善,为客户端的Http编程提供高效、最新、功能丰富的工具包支持。 c)Android.net.*(Android网络接口) 常常使用此包下的类进行Android特有的网络编程,如:访问WiFi,访问Android联网信息,邮件等功能。 2)网络 架构 主要有两种模式B/S,C/S B/S----》就是浏览器/服务器端模式了,通过应用层的HTTP协议通信,不需要特定客户端软件,而是需要统一规范的客户端,简而言之就是Android网络浏览器(如chrome,UcWeb,QQ浏览器等等)访问web服务器端的方式了。 C/S-----》就客户端/服务器端模式,通过任意的网络协议通信

网络编程之BIO

冷暖自知 提交于 2019-12-07 16:36:28
服务端代码: package com.itbac.BIO; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; /** * 服务器 */ public class BIOServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8080); System.out.println("服务器启动成功!"); while (!serverSocket.isClosed()) { Socket request = serverSocket.accept(); //阻塞 System.out.println("收到新连接:"+request.toString()); try { //获取输入流 InputStream inputStream = request.getInputStream(); //net 网络 + IO

python3 最简单的网络编程tcp

不想你离开。 提交于 2019-12-07 16:18:26
服务器端 # server_tcp.py import socket sk = socket.socket() # 创建socket对象 sk.bind(("192.168.36.106", 6666)) # 绑定IP和端口号 sk.listen() # 开启监听 print("开启监听!") conn, address = sk.accept() # 等待客户端连接 阻塞 print("客户端连接成功!") while 1: # 开始和客户端聊天,以下程序是服务端先发送消息 conn.send(input(">>>:").strip().encode("utf-8")) msg = conn.recv(1024) # 阻塞 print(f"来自客户端的消息:{msg.decode('utf-8')}") if msg.decode("utf-8").upper() == "BYE": break conn.close() sk.close() 客户端 # client_tcp.py import socket sk = socket.socket() # 创建socket对象 sk.connect(("192.168.36.106", 6666)) # 连接服务端 while 1: msg = sk.recv(1024) print("来自服务端的消息:", msg.decode

GIT 传输协议实现

微笑、不失礼 提交于 2019-12-07 15:59:58
GIT 传输协议实现 在 GIT 的三种主流传输协议 HTTP SSH GIT 中,GIT 协议是最少被使用的协议(也就是 URL 以 git:// 开始的协议)。 这是由于 git 协议的权限控制几乎没有,要么全部可读,要么全部可写,要么全部可读写。所以对于代码托管平台来说, git 协议的目的仅仅是为了支持 公开项目的只读访问。 在 git 的各种传输协议中,git 协议无疑是最高效的,HTTP 受限于 HTTP 的特性,传输过程需要构造 HTTP 请求和响应。 如果是 HTTPS 还涉及到加密解密。另外 HTTP 的超时设置,以及包体大小限制都会影响用户体验。 而 SSH 协议的性能问题主要集中在加密解密上。当然相对于用户的信息安全来说,这些代价都是可以接受。 git 协议实际上相当于 SSH 无加密无验证,也就无从谈起权限控制,但实际上代码托管平台内部的一些同步服务,如果使用 git 协议实现,将会得到很大的性能提升。 传输协议规范 git 协议的技术文档可以从 git 源码目录的 Documentation/technical 找到,即 Packfile transfer protocols 创建 TCP 连接后,git 客户端率先发送请求体,请求格式基于 BNF 的描述如下: git-proto-request = request-command SP pathname

【网络编程】大端模式和小端模式(大头序和小头序)

≡放荡痞女 提交于 2019-12-07 11:09:15
大端:多字节值的大端存储在该值的起始位置;(老大站排头为大) 小端:多字节值的小端存储在该值的起始位置;(老小站排头为小) 例如16bit整数:0x0102,其中01即为多字节值的大端,02即为多字节值的小端。 在网络中传输的都是大端序,但具体到某台主机CPU的实现,则有可能是大端序也可能是小端序。一般X86是小端。 那么,如何通过程序来判断当前主机到底是大端还是小端呢? /*判断大端还是小端, 1:小端 0:大端*/ int GetEndian() { union { int a; char b; } s; s.a = 0x0001; return (1 == s.b); } 联合体union的存放顺序是所有成员都从低地址开始存放,给s.a赋值为0x01,00为a的高端,01为a的低端,如果b==1,即a的低端位于起始位置,即小端,反之为大端。 我觉得《UNIX网络编程》(第一卷)给的例子更严密一些: /*判断大端还是小端, 1:小端 0:大端*/ int GetEndian() { union { short s; char c[sizeof(short)]; }un; un.s = 0x0102; if(2 == sizeof(short)) { if(1 == un.c[0] && 2 == un.c[1]) { printf("big-endian\n"); return

Java网络编程之UDP

六月ゝ 毕业季﹏ 提交于 2019-12-07 08:16:34
UDP 是 User Datagram Protocol 的简称, 中文名是用户数据报协议,是 OSI(Open System Interconnection ,开放式系统互联 ) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务, IETF RFC 768 是 UDP 的正式规范。 UDP的特征: 不需要建立连接,将数据及相关的地址都封装到数据包中 每个数据包的大小限制在64k 不需要建立连接,所以效率比较高,正因为不需要连接所以是不可靠协议 Socket Socket 就是为网络服务提供的一种机制 通信的两端都有 Socket 网络通讯其实就是 Socket 通信 数据在两个 Socket 间进行传输 Java中使用UDP的步骤 发送端 建立UDP的socket服务 封装数据包(指明接收端的IP地址,和接收端的端口号 ) 通过socket的Send()发送数据 关闭服务 接收端 创建socket服务(需要指明监视的端口号,并且要和发送端指定的接受端口的端口号一致) 定义数据包用于接收数据(构建DatagramPacket packet用于接收数据) 通过socket的Receiver()接受数据 通过packet提供的相应方法获取发送端发送的信息 关闭服务 代码案例如下 发送端 package cc.enfp.socket.udp; import java

GO网络编程和Linux Socket API的关系

一笑奈何 提交于 2019-12-06 20:53:33
server.go package main import "net" import "fmt" import "bufio" import "strings" // only needed below for sample processing func main() { fmt.Println("Launching server...") // 监听端口8081 ln, _ := net.Listen("tcp", ":8081") // 接入 conn, _ := ln.Accept() for { message, _ := bufio.NewReader(conn).ReadString('\n') fmt.Print("Message Received:", string(message)) //处理一下收到的数据 newmessage := strings.ToUpper(message) //写回到客户端 conn.Write([]byte(newmessage + "\n")) } } client.c package main import "net" import "fmt" import "bufio" import "os" func main() { // 连接到服务器 conn, _ := net.Dial("tcp", "127.0.0.1:8081

网络编程 UDP协议 TCP局域网客户端与服务端上传下载电影示例

人盡茶涼 提交于 2019-12-06 20:32:31
UDP协议 (了解) 称之为数据包协议。 特点:   1) 不需要建立链接。   2) 不需要知道对方是否收到。   3) 数据不安全   4) 传输速度快   5)能支持并发   6) 不会粘包   7) 无需先启动服务端再启动客户端 优点:   - 传输速度快   - 能支持并发   - 不会粘包 缺点:   - 数据不安全, 容易丢失 应用场景: 早期的QQ聊天室。 # server端 import socket # socket.SOCK_DGRAM ---> UPD协议 server = socket.socket(type=socket.SOCK_DGRAM) # 服务端需要绑定一个地址,让别人知道你在哪里 server.bind( ('127.0.0.1', 9002) ) while True: # 发送数据给服务端的用户地址 data, addr = server.recvfrom(1024) print(addr) print(data) # msg = input('Server ---> Client:').encode('utf-8') # 无论服务端还是客户端,发送消息时,都必须知道对方是谁 # server.sendto(msg, addr) # client端 import socket client = socket.socket(type