socket模块
套接字主要是两个程序之间的“信息通道”。
创建服务器套接字后,让它等待连接。这样它就在某个网络地址处(IP地址和一个端口号的组合)监听
一个套接字就是一个socket模块中的socket类的实例。
实例化需要3个参数,对于一个普通的套接字,不需要提供任何参数:
-
地址族(默认是socket.AF_INET)
-
流(默认是socket.SOCK_STREAM)
-
使用的协议(默认是0)
套接字有两个方法:send和recv,用于传输数据
-
使用字符串参数调用send发送数据
-
用一个所需的(最大)字节数做参数调用recv来接收数据(通常用1024)
一个小型服务器:
import socket s = socket.socket() host = socket.gethostname() # 得到当前主机名(如www.baidu.com) port = 1234 s.bind((host, port)) # 与客户端connect的地址相同,格式为(host,port)的元组 # host是主机名,port是端口号 s.listen(5) # 监听(只有一个参数,即允许排队等待的连接数目,这些连接在禁用之前等待接收) while True: c, addr = s.accept() # 接收客户端的连接。等待直到客户端连接,然后返回一个格式为(client,address)的元组 print('Got connection from', addr) c.send('Thank you for connecting') c.close()
一个小型客户机:
import socket s = socket.socket() host = socket.gethostname() port = 1234 s.connect((host, port)) # 连接到服务器 print(s.recv(1024))
先运行服务器代码,进入等待状态,再运行客户端代码,出现如下报错:
PS D:pytest> python .jcjc14-1.py Got connection from ('192.168.1.4', 56424) Traceback (most recent call last): File ".jcjc14-1.py", line 13, in <module> c.send('Thank you for connecting') TypeError: a bytes-like object is required, not 'str'
修改代码,在数据前加‘b’,强制转换
服务器代码修改如下:
import socket s = socket.socket() host = socket.gethostname() port = 1234 s.bind((host, port)) s.listen(5) while True: c, addr = s.accept() print('Got connection from', addr) c.send(b'Thank you for connecting') c.close()
重新运行,服务器端:
PS D:pytest> python .jcjc14-1.py Got connection from ('192.168.1.4', 56484) Got connection from ('192.168.1.4', 56488)
客户端:
PS C:UsersAdministrator> python D:pytestjcjc14-2.py b'Thank you for connecting' PS C:UsersAdministrator> python D:pytestjcjc14-2.py b'Thank you for connecting'