1.0 最简单的小例子:
服务器
import socket
# 服务器
sk = socket.socket() # 创建socket
address = ('127.0.0.1', 8000) # 创建地址
sk.bind(address) # 绑定地址
sk.listen(3) # 监听
# 接收过来直接进行重命名
conn, addr = sk.accept() # 阻塞
print('连接成功')
str = input('input')
data = bytes(str, 'utf8')
conn.send(data)
客户端
import socket
#客户端
sk = socket.socket() # 创建socket
address = ('127.0.0.1', 8000) # 连接地址
sk.connect(address) # 连接
print('连接成功')
data = sk.recv(1024) # 接收数据
print(str(data, 'utf8')) # 转换为utf8
2.0 升级一下(可以进行持续聊天)
服务器server端
import socket
import time
sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.bind(address)
sk.listen(4)
while 1:
conn, addr = sk.accept() # 如果server 不退出 ,只是client端退出 可以用while 把该句包起来
print('连接地址:' + str(addr))
while 1:
try:
data = conn.recv(1024)
addtime = str(data, 'utf8') + '时间:' + str(time.asctime())
print(addtime)
if str(data, 'utf8') == '对方已结束聊天':
print('聊天结束' + '时间:' + str(time.asctime()))
break
inp = input('>>>') # 注意 命名 不要重名
if inp == 'exit':
conn.send(bytes('对方已结束聊天', 'utf8'))
print('聊天结束')
break
conn.send(bytes(inp, 'utf8'))
except Exception as e:
print('已异常关闭该连接')
break
sk.close()
# int 和 byte 不能互转
# string 和 byte 可以互转
# 粘包现象 发送数据 如果前后还有发送数据 会连到一起发送 解决办法在中间穿插一个 接收 另一方添加一个发送 就可以
# 至于 发送接收什么 随便写
客户client端
import socket
import time
sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.connect(address)
while 1:
inp = input('>>>')
if inp == 'exit':
sk.send(bytes('对方已结束聊天', 'utf8'))
print('聊天结束')
break
sk.send(bytes(inp, 'utf8'))
data = sk.recv(1024)
addtime = str(data, 'utf8') + '时间:' + str(time.asctime())
print(addtime)
if str(data, 'utf8') == '对方已结束聊天':
print('结束聊天' + '时间:' + str(time.asctime()))
break
sk.close()
3.0 继续升级(实现一对多并发的可持续聊天) 实现并发
服务器server端
import socketserver
class MyServer(socketserver.BaseRequestHandler):
def handle(self): # 覆盖掉父类的handle方法
print("服务端启动...")
while True:
conn = self.request
print(self.client_address)
while True:
client_data = conn.recv(1024)
print(str(client_data, "utf8"))
print("waiting...")
server_response = input(">>>")
conn.sendall(bytes(server_response, "utf8"))
# conn.sendall(client_data)
conn.close()
# print self.request,self.client_address,self.server
if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1', 8098), MyServer)
server.serve_forever()
客户client端
import socket
# ip_port = ('127.0.0.1', 8091) # server 端
ip_port = ('127.0.0.1', 8098) # server端(聊天)
sk = socket.socket()
sk.connect(ip_port)
print("客户端启动:")
while True:
inp = input('>>>')
sk.sendall(bytes(inp, "utf8"))
if inp == 'exit':
break
server_response = sk.recv(1024)
print(str(server_response, "utf8"))
sk.close()