Py003-02-02socket

socket

简单例子 拨打电话

服务端.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import socket

# 1 买手机
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2 绑定手机卡

phone.bind(('127.0.0.1',8081)) # ip 加端口号
# 3 开机
phone.listen(5) # 5代表最大链接数

# 4 等电话打入
print('starting....')
conn,client_addr = phone.accept()

# 5 收发消息
# 单位bytes 现在表示最大接受1024字节的数据
data = conn.recv(1024) # 1024代表接受数据的最大数
print('客户端的数据',data)
conn.send(data.upper())

# 6 挂电话
conn.close()

# 7 关机
phone.close()

客户端.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import socket

# 1 买手机
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 2 拨号
phone.connect(('127.0.0.1',8081)) # ip 加端口号

# 3 发/收消息
phone.send('hello'.encode('utf-8'))
data = phone.recv(1024)
print(data)

# 4 关闭
phone.close()

通讯循环

服务端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import socket

phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.bind(('127.0.0.1',8081)) # ip 加端口号
phone.listen(5) # 5代表最大链接数

print('starting....')
conn,client_addr = phone.accept()

while True: # 通讯循环
data = conn.recv(1024)
print('客户端的数据',data)
conn.send(data.upper())

conn.close()

phone.close()

客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
import socket

phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

phone.connect(('127.0.0.1',8081)) # ip 加端口号

while True:
msg = input('>>:').strip()
phone.send(msg.encode('utf-8'))
data = phone.recv(1024)
print(data)

phone.close()

重复启动服务端的bug

因为端口重复占用,所以必须收到切换端口

1
2
3
4
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 添加这一行代表重用端口
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
phone.connect(('127.0.0.1',8081)) # ip 加端口号

客户端直接敲回车发数据的bug

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import socket

phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

phone.connect(('127.0.0.1',8081)) # ip 加端口号

while True:
msg = input('>>:').strip()
# bug解决
if not msg:continue
phone.send(msg.encode('utf-8'))
data = phone.recv(1024)
print(data)

phone.close()

客户端意外中断,服务器端在linux里会造成死循环的bug

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import socket

phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
phone.bind(('127.0.0.1',8081)) # ip 加端口号
phone.listen(5) # 5代表最大链接数

print('starting....')
conn,client_addr = phone.accept()

while True: # 通讯循环
try:
data = conn.recv(1024)
# 针对客户端中断问题
if not data:break # 适用于linux 如果是windows就 try catch
print('客户端的数据',data)
conn.send(data.upper())
except ConnectionResetError: # 适用于windows
break

conn.close()

phone.close()

在不会并发的情况下——一个一个的服务用户

服务端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import socket

phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
phone.bind(('127.0.0.1',8081)) # ip 加端口号
phone.listen(5) # 5代表最大链接数

print('starting....')
while True: # 链接循环
conn,client_addr = phone.accept()

while True: # 通讯循环
try:
data = conn.recv(1024)
# 针对客户端中断问题
if not data:break # 适用于linux 如果是windows就 try catch
print('客户端的数据',data)
conn.send(data.upper())
except ConnectionResetError: # 适用于windows
break
conn.close()

phone.close()

服务一个客户就要把对应客户端终止才能服务下一个客户