Python--网络编程-----socket编程示例--打电话--加上通讯循环与bug修复

一、服务端

 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

 

posted @ 2018-04-05 19:27  xudachen  阅读(340)  评论(0编辑  收藏  举报