码迷,mamicode.com
首页 > 其他好文 > 详细

socket通信

时间:2020-04-20 21:17:30      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:enc   str   结束   多个   encode   form   处理   family   主机   

一、Socket的概念

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议

由于socket已经为我们封装好了,只需要遵循socket的规定去编程,写出的程序自然就是遵循TCP/UDP标准的

二、Socket套接字发展史和分类

1.基本概念

  1. 起源于20世纪70年代加利福尼亚大学伯克利分校版本的Unix,即BSD Unix,
  2. socket有时被人称为“伯克利套接字”或“BSD套接字”
  3. 刚开始socket被设计为同一主机上多个程序之间的通讯 — IPC或进程间通讯

2.分类

套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的

1)基于文件类型

套接字家族名字:AF_UNIX

unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一个机器,可以通过访问同一个文件系统间接完成通讯

2)基于网络类型

套接字家族名字:AF_INET

主要使用AF_INET,其他不做了解

三、Socket套接字工作流程

服务器先初始化Socket,然后与端口进行绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。如果有一个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务端的连接就建立了。客户端发送数据请求,服务端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束

1.socket模块函数用法

import socket
socket.socket(socket_family,socket_type,protocal = 0)
# socket_family:分为 AF_UNIX 或 AF_INET
# socket_type:分为 SOCK_STREAM 或 SOCK_DGRAM
# protocal:基本不填,默认为0

# 获取TCP/IP套接字
tcp_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 获取UDP/IP套接字
tcp_sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 1.服务端套接字函数
s.bind() # 绑定(主机,端口号)到套接字
s.listen() # 开始TCP监听
s.accept() # 被动接受TCP客户的连接,(阻塞式)等待连接的到来

# 2.客户端套接字函数
s.connect() # 主动初始化TCP服务器连接
s.connect_ex() # connec()函数扩展版本,出错时返回出错码,而不是抛出异常

# 3.公共端套接字函数
s.recv() # 接收TCP数据
s.send() # 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall() # 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom() # 接收UDP数据
s.sendto() # 发送UDP数据
s.getpeername() # 连接到当前套接字的远端的地址
s.getsockname() # 当前套接字的地址
s.getsockopt() # 返回指定套接字的参数
s.setsockopt() # 设置指定套接字的参数
s.close() # 关闭套接字

四、基于TCP套接字

TCP是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端

1.TCP服务端

import socket

server_side = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_side.bind(("127.0.0.1",8080))
server_side.listen(5)
print("服务端启动完成,开始监听地址:{}:{}".format("127.0.0.1",8080))
while True:
    conn,client_address = server_side.accept()
    while True:
        try:
            data = conn.recv(1024)
            if data == 0:
                break
            print("客户端发来信息:{}".format(data.decode("utf-8")))
            conn.send(data.upper())
        except Exception:
            break
    conn.close()

2.TCP客户端

import socket

client_side = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client_side.connect(("127.0.0.1",8080))
while True:
    msg = input("输入要发送的信息:").strip()
    if len(msg) == 0:
        continue
    client_side.send(msg.encode("utf-8"))
    data = client_side.recv(1024)
    print(data.decode("utf-8"))

client_side.close()

socket通信

标签:enc   str   结束   多个   encode   form   处理   family   主机   

原文地址:https://www.cnblogs.com/zhuyouai/p/12740299.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!