python socket通讯定义如下
socket.socket([family[, type[, proto]]]) #family: 套接字家族,可以是 AF_UNIX 或者 AF_INET, #AF_UNIX:只能够用于单一的Unix系统进程间通信,AF_INET:服务器之间网络通信。 #type: 套接字类型,SOCK_STREAM流式socket , for TCP 或 SOCK_DGRAM数据报式socket , for UDP。 #protocol: 一般不填默认为 0。
服务端代码
import socket # 导入 socket 模块
s = socket.socket() # 创建 socket 对象
s.bind(('127.0.0.1', 5001)) # 绑定端口
s.listen(5) # 等待客户端连接
while True:
c,addr = s.accept() # 建立客户端连接
c.send('欢迎点赞!'.encode('utf-8'))
c.close() # 关闭连接
客户端代码
import socket # 导入 socket 模块
s = socket.socket() # 创建 socket 对象
s.connect(('127.0.0.1', 5001))
print(s.recv(1024).decode())
s.close()
注意上面的代码中使用了encode和decode函数,socket 套接字传输使用的必须是字节串所以在 发送数据时候做了一步字符串编码str.encode(‘utf-8’) ,编码格式选的 utf-8,这样就把字符串变成了字节串。这是因为Bytes才是计算机里真正的数据类型,也是网络数据传输中唯一的数据格式,什么Json,Xml这些格式的字符串最后想传输也都得转成Bytes的数据类型才能通过socket进行传输 。
上面的代码只完成了一次发送和接受就关闭了通讯。实际使用过程中我们可能更多的会发送->接受->发送->接受循环下去
服务端代码
import socket
import datetime
import time
import sys
bufsize = 1024
host = '127.0.0.1'
port = 5000
address = (host, port)
server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sock.bind(address)
server_sock.listen(1)
while True:
print('waiting for connection...')
clientsock, addr = server_sock.accept()
print('received from :', addr)
while True:
data = clientsock.recv(bufsize)
print(' data received---->%sn%s' % (datetime.datetime.now(), data.decode()))
data = input("send data----->")
time.sleep(4)
clientsock.send(data.encode('utf-8'))
clientsock.close()
server_sock.close()
客户端代码
from socket import *
import datetime
bufsize = 1024
host = '127.0.0.1'
port = 5000
addr = (host, port)
client_sock = socket(AF_INET, SOCK_STREAM)
client_sock.connect(addr)
while True:
data = input("send data---->")
if not data:
break
else:
client_sock.send(data.encode('utf-8'))
data = client_sock.recv(bufsize)
print('data received---->%sn%s' % (datetime.datetime.now(), data.decode()))
client_sock.close()
注意:Python3.x 中 input() 函数接受一个标准输入数据,返回为 string 类型
如果你某一次强制结束程序,再运行的时候报错OSError: [Errno 98] Address already in use
sudo lsof -i:XXXX #python3.8 12013 mby 3u IPv4 171714 0t0 TCP localhost:5000 (LISTEN) #kill 12013 12013是对应的PID #先关client,再关server,可以避免这种问题的发生。



