一、python网络编程
1、基于TCP客户/服务器程序的套接字函数
2、服务器端编程步骤:
- 第一步,socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- 第二步,绑定地址
- 使用listen方法进行监听状态
- 循环监听状态
#服务器端
import socket
server = socket.socket()
server.bind(('localhost',6798)) #绑定要监听端口
server.listen(5) #监听
print("我要开始等电话了")
while True:
conn, addr = server.accept() # 等电话打进来
# conn就是客户端连过来而在服务器端为其生成的一个连接实例
print(conn, addr)
print("电话来了")
count = 0
while True:
data = conn.recv(1024)
print("recv:",data)
if not data:
print("client has lost...")
break
conn.send(data.upper())
count+=1
if count >10:break
server.close()
输出结果
3、客户端编程步骤:
- 第一步,创建一个socket对象,以连接服务器端 clientsock socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- 第二步,连接至服务器端 client.connect(('localhost',6789))
- 第三步,发送请求 client.send()
#客户端
import socket
client = socket.socket() #声明socket类型,同时生成socket连接对象
client.connect(('localhost',6798))
while True:
msg = input(">>:").strip()
if len(msg) == 0:continue
client.send(msg.encode("utf-8"))
data = client.recv(10240)
print("recv:",data.decode())
client.close()
输出结果
socket
tcp/ip send, recv
udp
family address
AF.INET ipv4
AF.INET6
AF.UNIX 。local
socket protocol type
sock.SOCK_STREAM tcp/ip
socket.SOCK_DGRAM 数据报式socket , for UDP
服务端
server = socket.socket(AF.INET,sock.SOCK_STREAM)
server.bind(localhost,9999)
server.listen()
while True:
conn,addr = server.accept() #阻塞
while True:
print("new conn",addr)
data = conn.recv(1024) #8192 #recv默认是阻塞的
if not data:
break #客户端已断开, conn.recv收到的就都是空数据,
print(data)
conn.send(data.upper())
client
client = socket.socket()
client.connect(serverip, 9999 )
client.send(data)
client.send(data)
client.recv(dat)
4、socket 粘包
5、socketserver
多并发实现
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
while True:
try:
self.data = self.request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data)
self.request.send(self.data.upper())
except ConnectionResetError as e:
print("err",e)
break
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
# Create the server, binding to localhost on port 9999
server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
import socket
client = socket.socket()
#client.connect(('192.168.16.200',9999))
client.connect(('localhost',9999))
while True:
cmd = input(">>:").strip()
if len(cmd) == 0: continue
client.send(cmd.encode("utf-8"))
cmd_res_size = client.recv(1024) ##接受命令结果的长度
print("命令结果大小:",cmd_res_size)
received_size = 0
received_data = b''
while received_size < int(cmd_res_size.decode()) :
data = client.recv(1024)
received_size += len(data) #每次收到的有可能小于1024,所以必须用len判断
#print(data.decode())
received_data += data
else:
print("cmd res receive done...",received_size)
print(received_data.decode())
client.close()
输出结果