一、服务端
1 import socket 2 3 4 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 5 phone.bind(('127.0.0.1', 8080)) # 0-65535:0-1024给操作系统使用 6 phone.listen(5) 7 8 print('starting.....') 9 conn, client_addr = phone.accept() 10 print(client_addr) 11 12 while True: # 通信循环 13 data = conn.recv(1024) 14 print('客户端的数据', data) 15 16 conn.send(data.upper()) 17 18 conn.close() 19 phone.close()
二、客户端
1 import socket 2 3 4 # 1、买手机 5 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 6 # print(phone) 7 8 # 2、拨号 9 phone.connect(('127.0.0.1', 8080)) 10 11 # 3、发、收消息 12 while True: 13 msg = input('>>:').strip() 14 phone.send(msg.encode('utf-8')) 15 data = phone.recv(1024) 16 print(data) 17 18 # 4、关闭 19 phone.close()
客户端结果为:
1 >>:he 2 b'HE' 3 >>:asdf 4 b'ASDF' 5 >>:
服务端结果为:
1 starting..... 2 ('127.0.0.1', 64037) 3 客户端的数据 b'he' 4 客户端的数据 b'asdf'
三、有时间运行服务端程序的时候,显示端口占用错误,这时候可以使用如下代码防止出现这种情况
1 phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
四、当客户端输入为空时(也就是直接回车),按回车后,客户端一直横在那,
原因分析:
客户端发送空信息需要调用操作系统接口,把客户端程序内存中要发送的信息拷贝到操作系统内存中,如果为空的话,操作系统内存收不到数据,它也就不会发送给服务端,所以出现客户端横在那的现象
解决方法:
修改客户端代码:
1 while True: 2 msg = input('>>:').strip() 3 if not msg: 4 continue 5 phone.send(msg.encode('utf-8')) 6 data = phone.recv(1024) 7 print(data)
五、如果客户端意外断开连接发生中断,linux系统中,服务端会发生死循环,Windows系统中,服务端会直接报错
解决方法:
修改服务端代码:
1 while True: # 通信循环 2 try: 3 data = conn.recv(1024) 4 if not data: # 适用于linux操作系统 5 break 6 print('客户端的数据', data) 7 8 conn.send(data.upper()) 9 except ConnectionResetError: # 适用于windows操作系统 10 break