什么是socket
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
基于TCP协议的socket端
sever端
16
1
import socket
2
3
4
sk = socket.socket() # 买手机
5
# sk.bind(('ip', 'port')) # 绑定ip地址和端口号码以元组的形式传递
6
sk.bind(('127.0.0.1', 8898))
7
sk.listen() # 监听 等着有人来打电话
8
9
conn, addr = sk.accept() # 接收到别人的电话
10
11
ret = conn.recv(1024) # 设置最大字节
12
print(ret) # 打印内容到控制台
13
conn.send(b'hi') # 和别人说话,必须传一个bytes类型
14
15
conn.close() # 挂电话
16
sk.close() # 关手机
client端
11
1
import socket
2
3
4
sk = socket.socket() # 买手机
5
sk.connect(('127.0.0.1', 8898)) # 绑定手机卡
6
7
sk.send(b'hello') # 发送消息
8
ret = sk.recv(1024)
9
print(ret)
10
11
sk.close()
注意事项:先运行server端,在运行client端 , 基于TCP协议的 socket 接收与发送必须是一致的
解决方法
17
1
import socket
2
3
4
sk = socket.socket() # 买手机
5
6
# sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
7
sk.bind(('127.0.0.1', 8898)) # 绑定ip地址和端口号码以元组的形式传递
8
sk.listen() # 监听 等着有人来打电话
9
10
conn, addr = sk.accept() # 接收到别人的电话
11
12
ret = conn.recv(1024) # 设置最大字节
13
print(ret) # 打印内容到控制台
14
conn.send(b'hi') # 和别人说话,必须传一个bytes类型
15
16
conn.close() # 挂电话
17
sk.close() # 关手机
实现多条消息的发送
sever端
20
1
import socket
2
3
4
sk = socket.socket() # 买手机
5
# sk.bind(('ip', 'port')) # 绑定ip地址和端口号码以元组的形式传递
6
sk.bind(('127.0.0.1', 8898))
7
sk.listen() # 监听 等着有人来打电话
8
conn, addr = sk.accept() # 接收到别人的电话
9
10
ret = conn.recv(1024) # 设置最大字节
11
print(ret) # 打印内容到控制台
12
conn.send(b'hi') # 和别人说话,必须传一个bytes类型
13
14
ret = conn.recv(1024) # 接收传过来的今天中午吃什么
15
print(ret.decode('utf-8'))
16
conn.send(bytes('大腕油泼面价格蛋'.encode('utf-8'))) # 回复一条
17
18
19
conn.close() # 挂电话
20
sk.close() # 关手机
client端
17
1
import socket
2
3
4
sk = socket.socket() # 买手机
5
sk.connect(('127.0.0.1', 8898)) # 绑定手机卡
6
7
sk.send(b'hello') # 发送消息
8
ret = sk.recv(1024) # 接收传过来的消息
9
print(ret) # 打印穿过来的消息
10
11
sk.send(bytes('中午吃什么?'.encode('utf-8'))) # 再次发送消息。(中文需转码)
12
13
ret = sk.recv(1024) # 接收回复的‘大腕油泼面价格蛋’
14
print(ret.decode('utf-8')) # 打印并解码
15
16
17
sk.close()
实现server / client端一直聊天
server端
28
1
import socket
2
3
4
sk = socket.socket() # 买手机
5
# sk.bind(('ip', 'port')) # 绑定ip地址和端口号码以元组的形式传递
6
sk.bind(('127.0.0.1', 8898))
7
sk.listen() # 监听 等着有人来打电话
8
conn, addr = sk.accept() # 接收到别人的电话
9
10
while True:
11
ret = conn.recv(1024).decode('utf-8')
12
if ret == 'bey':
13
break
14
print(ret)
15
info = input('>>>')
16
conn.send(bytes(info, encoding='utf-8'))
17
18
# ret = conn.recv(1024) # 设置最大字节
19
# print(ret) # 打印内容到控制台
20
# conn.send(b'hi') # 和别人说话,必须传一个bytes类型
21
#
22
# ret = conn.recv(1024) # 接收传过来的今天中午吃什么
23
# print(ret.decode('utf-8'))
24
# conn.send(bytes('大腕油泼面价格蛋'.encode('utf-8'))) # 回复一条
25
26
27
conn.close() # 挂电话
28
sk.close() # 关手机
client端
x
1
import socket
2
3
4
sk = socket.socket() # 买手机
5
sk.connect(('127.0.0.1', 8898)) # 绑定手机卡
6
7
while True:
8
info = input('>>>')
9
sk.send(bytes(info, encoding='utf-8'))
10
ret = sk.recv(1024).decode('utf-8')
11
print(ret)
12
if ret == 'bey':
13
sk.send(b'bey')
14
break
15
# sk.send(b'hello') # 发送消息
16
# ret = sk.recv(1024) # 接收传过来的消息
17
# print(ret) # 打印穿过来的消息
18
#
19
# sk.send(bytes('中午吃什么?'.encode('utf-8'))) # 再次发送消息。(中文需转码)
20
#
21
# ret = sk.recv(1024) # 接收回复的‘大腕油泼面价格蛋’
22
# print(ret.decode('utf-8')) # 打印并解码
23
24
25
sk.close()