socket概念 套接字
理解socket
soxket因为TCP是面向流的,你发的信息如果很多很快,TCP这样就会形成黏包
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
其实站在你的角度上看,socket就是一个模块。我们通过调用模块中已经实现的方法建立两个进程之间的连接和通信。
也有人将socket说成ip+port,因为ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序。
所以我们只要确立了ip和port就能找到一个应用程序,并且使用socket模块来与之通信。
socket层
套接字(socket)初使用
基于TCP协议的socket
tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端
server端
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8898)) #把地址绑定到套接字 这个ip地址和端口是输入你想进行连接的地址和端口
sk.listen() #监听链接
conn,addr = sk.accept() #接受客户端链接
ret = conn.recv(1024) #接收客户端信息
print(ret) #打印客户端信息
conn.send(b'hi') #向客户端发送信息
conn.close() #关闭客户端套接字
sk.close() #关闭服务器套接字(可选)
import socket
sk = socket.socket() # 买手机
sk.bind(('127.0.0.1', 9000)) # 插卡
sk.listen() # 等待连接
conn,addr = sk.accept() # 等着接conn 电话 后面是ip和端口
print(addr) # 把IP和端口打印出来
# conn.send('您好'.encode('UTF-8'))
ret = conn.recv(1024) # 这个是接受你传递进来信息 1024是1024个字节一般不会超过这个字节
conn.send('您好'.encode('UTF-8')) # 你回发的消息
print(ret.decode('UTF-8')) #把你接受的信息 给解码
conn.close() # 关闭信息
sk.close() # 关机
因为tcp是全双工的通信可以先发送再接受消息的 所以 recv和send可以颠倒顺序
client端
import socket
sk = socket.socket() # 创建客户套接字
sk.connect(('127.0.0.1',8898)) # 尝试连接服务器
sk.send(b'hello!')
ret = sk.recv(1024) # 对话(发送/接收)
print(ret.decode('UTF-8'))
sk.close() # 关闭客户套接字
上面只是一个小小的就是只发一次的通信 我们下面做一个可以一直通信并且可以询问什么时候结束的:
升级版版本
server端:
import socket
sk = socket.socket()
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 这个是你的端口和别的相连接的时候还继续可以进行连接
sk.bind(('127.0.0.1', 9010))
sk.listen()
while True:
conn,addr = sk.accept() # 这个必须放在外面 不然你放在里面别人给你打电话的时候不至于一直还要重新接受端口不合理 while True:
# conn, addr = sk.accept()
ret = conn.recv(1024).decode('UTF-8')
print(ret)
if ret == 'q':break
inp = input('>>>>').strip()
conn.send(inp.encode('UTF-8'))
if inp == 'q':break
conn.close()
sk.close()
client端口:
import socket
sk = socket.socket()
sk.connect(('127.0.0.1', 9010))
while True:
inp = input('>>>').strip()
sk.send(inp.encode('UTF-8'))
if inp == 'q':break
ret = sk.recv(1024).decode('UTF-8')
print(ret)
if ret == 'q':break
sk.close()
tcp协议适用于 文件的上传和下载 发送邮件 发送重要的文件
每和一个客户端建立链接 都会在自己的操作系统上占用一个资源
同一时间 只能 和一个客户端通信
基于UDP协议的socket(套接字)
tcp是只能依次只能连接一个因为它需要找到端口来连接 一个端口只能对应一个程序 所以tcp的服务端只能和一个请求者相连接
而UDP协议是不需要端口的 所以我们不需要进行端口的连接 直接可以相连接
sever端口:
import socket
lst = {'egon':'\033[1;31m', 'eva':'\033[1;34m'} # 把你的信息存放在一个字典中 然后你马上输入的信息人名字会从中合格字典中提取
sk = socket.socket(type =socket.SOCK_DGRAM)
sk.bind(('127.0.0.1', 9090))
while True:
msg,client_addr = sk.recvfrom(1024)
name,messg = msg.decode('UTF-8').split(':') # 因为你设置的发送端是把名字加冒号把内容给传递进来的 所以我们以冒号为分割点
color = lst.get(name.strip(),'')
print('{} {}'.format(color,msg.decode('UTF-8')))
inp = input('>>>').strip()
sk.sendto(inp.encode('UTF-8'),client_addr)
sk.close()
client端口:
import socket
sk = socket.socket(type = socket.SOCK_DGRAM)
name = input('>>>>').strip() while True:
inp = input('>>>').strip()
sk.sendto("{}:{}".format(name,inp).encode('UTF-8'), ('127.0.0.1', 9090))
msg,addr = sk.recvfrom(1024)
print(msg.decode('UTF-8'))
sk.close()
UDP的升级版本:
server端口: from mysocket import Mysocket
sk = Mysocket()
sk.bind(('127.0.0.4', 9090))
while True:
msg,client_addr = sk.my_recv(1024)
print(msg)
if msg == 'q':sk.close()
inp = input('>>').strip()
sk.my_send(inp,client_addr)
if inp == 'q':sk.close()
sk.close() 你需要导入的模块mysocket
from socket import *
class Mysocket(socket): # 继承socket这个模块
def __init__(self, coding = 'UTF-8'):
self.coding = coding # 把utf-8赋值给对象的属性
super().__init__(type = SOCK_DGRAM) # 调用父类中 type
def my_recv(self, num):
msg, addr = self.recvfrom(num)
return msg.decode(self.coding),addr # 把输入者和端口返回出去
def my_send(self, msg, addr):
return self.sendto(msg.encode(self.coding),addr) clinet端口:
from mysocket import Mysocket
sk = Mysocket()
while True:
inp = input('>>').strip()
sk.my_send(inp,('127.0.0.4', 9090))
msg,addr = sk.my_recv(1024)
print(msg)
sk.close()
udp升级版本
socket概念 套接字的更多相关文章
- python 全栈开发,Day33(tcp协议和udp协议,互联网协议与osi模型,socket概念,套接字(socket)初使用)
先来回顾一下昨天的内容 网络编程开发架构 B/S C/S架构网卡 mac地址网段 ip地址 : 表示了一台电脑在网络中的位置 子网掩码 : ip和子网掩码按位与得到网段 网关ip : 内置在路由器中的 ...
- iOS - Socket 网络套接字
1.Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个 Socket.Socket 又称 "套接字",应用程序通常通过 "套接字& ...
- Socket称"套接字"
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 二.利用Socket建立网络连接的步骤 建立Socket连接至少需要一对 ...
- Win2 Socket(套接字)相关 API
Socket(套接字) 作者信息 肖进 单位:南京中萃食品有限公司 资讯部 邮箱:xiaoj@njb.swirebev.com 电话:025-58642091 与socket有关的一些函数介绍 1.读 ...
- sanic官方文档解析之Custom Protocols(自定义协议)和Socket(网络套接字)
1,Custom Protocol:自定义协议 温馨提示:自定义协议是一个高级用法,大多数的读者不需要用到此功能 通过特殊的自定义协议,你可以改变sanic的协议,自定义协议需要继承子类asyncio ...
- Linux Socket 原始套接字编程
对于linux网络编程来说,可以简单的分为标准套接字编程和原始套接字编程,标准套接字主要就是应用层数据的传输,原始套接字则是可以获得不止是应用层的其他层不同协议的数据.与标准套接字相区别的主要是要开发 ...
- Linux系统C语言socket tcp套接字编程
1.套接字的地址结构: typedef uint32_t in_addr_t; //32位无符号整数,用于表示网络地址 struct in_addr{ in_addr_t s_addr; //32位 ...
- Python之socket(套接字)
Socket 一.概述 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...
- Pyhont 网络编程【第一篇】初始Socket网络套接字
一.什么是socket: Socket 别名 “网络套接字”,指网络通信链句柄 其实就是一堆网络信息(ip+端口) 建立起的链接称之为socket,Socket的英文原义是“孔”或“插座”,用来实现不 ...
随机推荐
- 爬虫URL去重
这个要看你想抓取的网页数量是哪种规模的.如果是千万以下用hash表, set, 布隆过滤器基本可以解决,如果是海量的......嗯我也没做过海量的,不过hash表之类的就别想了,内存根本不够,分割线下 ...
- 解决图片浮动调节不了的问题(使用vertical-align属性)
vertical-align: middle; vertical-align 属性设置元素的垂直对齐方式. baseline 默认.元素放置在父元素的基线上.sub 垂直对齐文本的下标.super ...
- struts2 基本流程
一.配置过程 1.在web.xml中配置过滤器 <filter> <filter-name>StrutsPrepareAndExecuteFilter</filter-n ...
- digestmd5.c:4037:15: error: #elif with no expression
执行如下:sed -i.bak 's/#elif WITH_DES/#elif defined(WITH_DES)/' \ plugins/digestmd5.c
- 我们的GAME-TECH沙龙北京站完美收官了,都讨论了些啥?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由 腾讯游戏云 团队首发与云+社区 摘要:4月13日,腾讯游戏云GAME-TECH游戏开发者技术沙龙于北京举办.此次活动是腾讯游戏云游戏 ...
- 关于C#的强制转换和尝试转换的方法
将String[]类型的Object类型,转换为String[]类型: public string ObjectToString(object ob) { string str = string.Em ...
- [linux] shell脚本编程-ubuntu创建vsftpd服务
1. useradd -s /bin/bash -m 用户名 , 创建用户,自动创建家目录 , 设置登录shell 2. echo 用户名:密码 | chpasswd ,非交互式设置密码 3. ...
- 一、window下zookeeper独立部署
zookeeper是一个分布式协调应用,用于管理大型主机.通俗地说,分布式应用相对于单体应用存在着很多要处理的问题,而这些问题通常是不太好处理的.比如,典型的一致性问题,而zookeeper可以很简单 ...
- Spring中的Bean配置方式
1.IOC和DI概述 IOC(Inversion of Control):其思想是反转资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源. 作为回应, 容器适时的返回资源. 而应用了 ...
- 工作经验:Java 系统记录调用日志,并且记录错误堆栈
前言:现在有一个系统,主要是为了给其他系统提供数据查询接口的,这个系统上线不会轻易更新,更不会跟随业务系统的更新而更新(这也是有一个数据查询接口系统的原因,解耦).这时,这个系统就需要有一定的方便的线 ...