socket网络编程
关键字
应用程序接口(API)
套接字接口(Socket API)
作用
应用程序可以通过套接字接口来使用网络套接字,以进行数据交换。最早套接字来自于4.2 BSD,现带常见的套接字接口大多来源于Berkeley套接字(Berkeley Sockets)标准
套接字地址(Socket Address)
远程的套接字地址和本地的套接字地址完成连线后,再加上使用的协议(Protocol),这个五元组(Five-element Tuple,来源IP、目的IP、来源端口、目的端口和协议)作为套接字对(Socket Pairs)就可以彼此交换数据。
本质
是操作系统提供的一种进程通信机制,是主机间或者一台计算机上的进程间可以通信。
套接字模块
socket(family,type[,protocal]) ###这种[,]中的元素是不是可填可不填的
family
指定调用者期待返回的套接字接口地址结构的类型。常见的可以使用的是AF_UNIX,AF_INET,AF_INET6,AF_UNSPEC。
AF_UNIX用于同一台机器上的进程通信(windows不支持)。AF_INET标识IPv4通信,不能返回任何IPv6相关的信息。AF_INET6表示使用IPv6通信,不能返回任何IPv4相关的信息。AF_UNSPEC表示函数返回的是适用于指定主机名和服务名并且适合任何协议族的地址,可能是IPv4,也可能是IPv6,依赖于通信的时候使用的是何种IP地址协议。
type
指定套接字类型。常见的有SOCK_STREAM、SOCK_DGRAM和SOCK_RAM。
可以根据是面向连接还是非连接非为SOCK_STREAM(对应TCP协议)或SOCK_DGRAM(对应UDPSOCK_RAM.协议)。
使用原始套接字可以处理ICMP、IGMP、等网络报文,就是SOCK_RAM.
protrocl
该参数可以不填,一般默认为0
socket对象方法
1.服务端可以使用的方法
.bind():绑定,括号中是一个元组(host,port),也就是括号包括号(())
.listen():监听,括号内可填写连接进来监听的数量
.accept():被动接收连接
2.客户端可以使用的方法
.connect():括号中是一个元组(host,port),主动初始化TCP服务器连接,如果连接错误,返回socket.error
.connect_ex():connect()函数的扩展版本,出现错误返回错误码,不抛出异常。
公共用途的方法
.recv():接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可忽略。
.send():发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,改数量可能小于string的字节大小。
.sendall():完整发送TCP数据,将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据,成功返回None,失败则抛出异常。
s.close():关闭套接字
当然还有其他方法,太多了,列几个初学常用的
在本机上编写客户端和服务端的疑惑
服务端和客户端可以公用一个地址
客户端还是后台程序,地址绑定的是计算机中分配的,让客户端能够找到这个程序
客户端找到这个程序是通过那个地址
客户端你想发送数据可以使用sendto,你想接收数据可以使用recv()
服务端同样如此,但客户端总是比服务端后开启,缘由客户端的性质就是要与服务端建立连接。
测试服务器端口是否联通
cmd进入
telnet ip地址 端口号
没有开通这个端口会显示
正在连接127.0.0.1...无法打开到主机的连接。
常用的换行符在发送请求时可以加上,使服务器能够响应
\r回车
苹果机(MAC OS系统)则采用回车符CR表示下一行(\r)Unix系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行结尾是“<回车><换行>”,即“\r\n”;Mac系统里,每行结尾是“<回车>”,即“\r”
代码流程
sys模块
import sys
# print(sys.modules.keys())
# print(sys.modules.values())
# sys.modules查找已导入的包
print(sys.modules["os"])
socket模块
tcp编程
# coding = 'utf-8'
# AttributeError: module 'socket' has no attribute 'AF_INET'
# 自己命名和包名相同
import socket
client =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('localhost',8080)) # 80
client.send('I am client!'.encode('utf-8'))
ser = client.recv(1024) # 使用同样的对象接收,同一个进程通信么
print(ser.decode('utf-8'))
client.send(b'exit')
print(ser.decode('utf-8'))
client.close()
TCP编程
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("127.0.0.1", 1234)) # 2018 端口
client.send("I'm Client!".encode("utf-8"))
server_content = client.recv(1024)
print(server_content.decode("utf-8")) # print打印的是空白,print打印的字符来源是
client.send(b"exit")
client.close()
udp
``
待补充
服务端客户端
待补充
笔记来源:零基础Python从入门到精通