Python3的Socket编程

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()

 

你可能感兴趣的:(Python)