一、网络基础

  1、c\s架构:客户端英文名称:Client(使用服务端的服务),服务端英文名称:Server

    软件c\s架构:QQ、微信、优酷、暴风影音、浏览器(IE、火狐,360浏览器等);

    软件b\s架构:其中浏览器又比较特殊,很多网站是基于浏览器来进行访问的,浏览器和各个网站服务端进行的通讯方式又常被成为B\S架构(浏览器英文名称:Browser)。核心技术采用了统一接口。

    硬件c/s架构:打印机

    不管哪个架构,他们都要进行网络通信,基本都要用socket,我们学习socekt就是为了完成C\S架构项目的开发。

  2、网络整个流程

    (1)、网线:传输电信号

    (2)、网卡:接受电信号

    (3)、集线器:将所有连接到集线器的设备连通起来

    (4)、交换机:升级版的集线器

    (5)、MAC地址(物理地址):网卡出场时候就已经确定的,独一无二的

                  如、8C-EC-4B-88-B9-C9(前三位厂商编号,后三位生产流水号)

    (6)、单播:一对一发送

    (7)、广播:一对多发送

    (8)、广播风暴:网络拥堵、信息不安全

    (9)、ip地址:ipv4地址:192.168.15.46 #4个点分二进制

            作用:划分广播域

    (10)、子网掩码:计算两个ip地址是否属于同一个子网(交换机从事这项工作)

        计算方法:子网掩码的二进制与目标地址和源地址的二进制分别位与运算,若结果相同,则属于同一子网,否则不属于同一子网。       

        源ip地址:192.168.15.46

            11000000.10101000.00001111.00101110

            11111111  .11111111  .11111111 .00000000

            11000000.10101000.00001111.00000000 #192.168.15.0

            目标的ip:192.168.16.30   #192.168.16.0

        结果:不是同一子网

    (11)、路由器:转发消息

    (12)、路由协议:计算路由发送信息的最优路径。

    (13)、网关:内网和外网的关卡

    (14)、ARP协议(地址解析协议):根据IP地址获取物理地址的一个TCP/IP协议

    (15)、DNS协议:DNS就是进行域名解析的服务器,记录了域名和公网ip的对应关系

    (16)、DHCP协议(动态主机设置协议):自动分配动态ip给终端。

    (17)、端口号: 0-65535,0-1024基本是内部程序使用。建议分配的临时端口号8000+;用于定位到某服务器的某程序

          ip地址+端口=确定某电脑上的某个程序

    (18)、NAT:网络地址转换,将局域网ip地址转换为公网的ip地址。

 

二、初始 socket

  1、实现简单的服务器和客户端的通信

     服务器程序:服务器.py

import socket
#实例化socket对象
server=socket.socket() #类似创建一部手机 ip_port=("192.168.15.35",8001)#买一个电话卡
#绑定一个ip和端口
server.bind(ip_port) #插卡 #监听
server.listen()#开机 #等待客户端连接
conn,addr=server.accept() #等待别人的电话, 阻塞现象 ;解包过程
print(conn) #连接通道
print(addr) #对方的ip和端口号 # 服务器使用管道发送消息 conn.send()
conn.send(b'zaima')
# 等待接受对方的消息
from_client_msg=conn.recv(1024)
print("来自客户端的消息:",from_client_msg)
conn.send(b'gun')
#关闭连接管道
conn.close() #挂电话
#关机,关闭socket
server.close()#拔电话线

    客服端程序:客服端.py

import socket
client=socket.socket()#实例化对象
#服务器的ip和端口
server_ip_port=("192.168.15.35",8001)
# 链接服务器的应用程序
client.connect(server_ip_port) from_server_msg1=client.recv(1024)#阻塞
print("服务器发来的第一条信息",from_server_msg1) #客服端用client.send给服务器发送消息,消息必须是bytes形式
client.send(b'yuema') # 再次等待服务器发送信息
from_server_msg=client.recv(1024) #阻塞 print("来自服务端的消息:",from_server_msg)
client.close()

    执行流程:先启动服务器程序-->再启动客服端程序

#服务器的结果显示:
<socket.socket fd=408, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.15.35', 8001), raddr=('192.168.15.35', 54866)>
('192.168.15.35', 54866)
来自客户端的消息: b'yuema'
客户端结果显示:
服务器发来的第一条信息 b'zaima'
来自服务端的消息: b'gun'

    2、程序升级,会话聊天现实,输入拜拜,推出程序

      升级版本的服务端程序

import socket
server=socket.socket() ip_port=("192.168.15.35",8001)
server.bind(ip_port) server.listen()
conn,addr=server.accept()
while 1:#模拟回话机功能
server_msg=input("张三>>>")
conn.send(server_msg.encode("utf-8"))
if server_msg == "拜拜":#如果输入"拜拜",发送信息给对方后,跳出while
break
else:
from_client_msg=conn.recv(1024).decode("utf-8")
print("李四>>>", from_client_msg)
if from_client_msg == "拜拜":#如果接收"拜拜",发送信息给对方后,跳出while
break conn.close()
server.close()

      升级版后的客户端程序

import socket
client=socket.socket() server_ip_port=("192.168.15.35",8001)
client.connect(server_ip_port)
while 1:
from_server_msg1=client.recv(1024).decode("utf-8")
print("张三>>>",from_server_msg1)
if from_server_msg1=="拜拜":#如果接收"拜拜",发送信息给对方后,跳出while
break
else:
client_msg=input("李四>>>")
client.send(client_msg.encode("utf-8"))
if client_msg == "拜拜":#如果输入"拜拜",发送信息给对方后,跳出while
break client.close()

    执行流程:先启动服务器程序-->再启动客服端程序

tcp端口复用问题解决方案

server=socket(AF_INET,SOCK_STREAM)
server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)

 

python 初始socket的更多相关文章

  1. 进击的Python【第十章】:Python的socket高级应用(多进程,协程与异步)

    Python的socket高级应用(多进程,协程与异步)

  2. Python底层socket库

    Python底层socket库将Unix关于网络通信的系统调用对象化处理,是底层函数的高级封装,socket()函数返回一个套接字,它的方法实现了各种套接字系统调用.read与write与Python ...

  3. 转:Python 的 Socket 编程教程

    这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. Python 官方关于 Socket 的函数请看 http://docs. ...

  4. Pyhont 网络编程【第一篇】初始Socket网络套接字

    一.什么是socket: Socket 别名 “网络套接字”,指网络通信链句柄 其实就是一堆网络信息(ip+端口) 建立起的链接称之为socket,Socket的英文原义是“孔”或“插座”,用来实现不 ...

  5. Python Udp Socket

    socket(套接字),传输层通信的端点,由IP和端口号组成(IP,Port),可以通过socket精确地找到服务器上的进程并与之通信 python2.6实现,基于AF_INET(网络套接字) 类型S ...

  6. Python Tcp Socket

    socket(套接字),传输层通信的端点,由IP和端口号组成(IP,Port),可以通过socket精确地找到服务器上的进程并与之通信 python2.6实现,基于AF_INET(网络套接字) 类型S ...

  7. Python 之socket的应用

    本节主要讲解socket编程的有关知识点,顺便也会讲解一些其它的关联性知识: 一.概述(socket.socketserver): python对于socket编程,提供了两个模块,分别是socket ...

  8. python tcp socket 多线程

    不多说,直接上代码 client.py #!/usr/bin/python import socket,sys,string host="localhost" port=8000 ...

  9. 老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具

    老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具 poptest是业内唯一的测试开发工程师培训机构,测试开发工程师主要是为测试服务开发测试工具,在工作中要求你做网络级别的安全 ...

随机推荐

  1. SQLite与FMDB使用中区别

    前几篇已经写完了SQLite与FMDB的基本内容以及衍生出来的知识点,我们这一篇主要讲述FMDB与SQLite在基本使用中的区别,大约需要5-10分钟时间讲述内容,欢迎大家指正. 基本使用区别 1.数 ...

  2. 从零开始学安全(三)●黑客常用的windows端口

    端口可选1-65536 1-1024 预保留端口 留给windows系统服务的 下面是常见的端口对应的服务 1 TCP Port Service Multiplexer 传输控制协议端口服务多路开关选 ...

  3. c# 接口的协变和逆变

    如果派生类只是用于输出值,那么这种结构化的委托有效性之间的常数关系叫做协变 就是创建一个派生类委托对象 让派生类赋值给基类对象 协变关键字out 对期望传入基类时允许传入派生对象的特性叫逆变  逆变关 ...

  4. double在输出为字符串的几种方法效率测试

    测试结果: double->none 366msdouble->long 161msdouble->long2 188msdouble->format 564msdouble- ...

  5. java体系架构

    java概念 java本身是一种面向对象的语言,最显著的特性有两方面,一是所谓的“书写一次,到处运行”(write once ,run anywhrer),能够非常容易的获得跨平台能力,另外就是垃圾收 ...

  6. Java编程思想__内部类

    1.对象.new语法 类结构 public class Outer { public String oName; class Inner { public String iName; public v ...

  7. 8张图让你一步步看清 async/await 和 promise 的执行顺序

    摘要: 面试必问 原文:8张图帮你一步步看清 async/await 和 promise 的执行顺序 作者:ziwei3749 Fundebug经授权转载,版权归原作者所有. 为什么写这篇文章? 说实 ...

  8. select2 插件编辑时设置默认值

    function htDate(selectCustomerId, val) { var customerId = selectCustomerId; var values = val; ajaxJs ...

  9. 一种快速构造和获取URL查询参数的方法:URLSearchParams

    URLSearchParams 接口定义了一些实用的方法来处理 URL 的查询字符串. URLSearchParams()是个构造函数,将返回一个可以操作查询字符串的对象. 常用方法: 1.构造查询字 ...

  10. HashMap的resize方法中尾部遍历出现死循环问题 Tail Traversing (多线程)

    一.背景介绍: 在看HashMap源码是看到了resize()的源代码,当时发现在将old链表中引用数据复制到新的链表中时,发现复制过程中时,源码是进行了反序,此时是允许反序存储的,同时这样设计的效率 ...