Meleuo

Python3实现socket 通信,阻塞,非阻塞,以及UDP案例
#!/usr/bin/env python3 #@ Blog:wwww.zheli.ink #@ 阻塞型tcp s...
扫描右侧二维码阅读全文
26
2019/06

Python3实现socket 通信,阻塞,非阻塞,以及UDP案例

#!/usr/bin/env python3
#@ Blog:wwww.zheli.ink
#@ 阻塞型tcp socket
import socket
import random
#定义一个默认参数的socket
sk = socket.socket() 
#定义服务p和端口
ip_port = ("192.168.9.133", 8888) 
#绑定服务ip和端口
sk.bind(ip_port) 
#定义最大连接数,
sk.listen(5)
while True:
    #socket启动后打印信息
    print("connecting.......")
    #被动模式启动,等待连接
    conn, address = sk.accept()
    #定义一个信息
    msg = "Hello socket!"
    #收连接后传输上面定义的信息
    conn.send(msg.encode())
    while True:
        #使用 .recv 从缓存区读取客户端发送过来的信息 1024 指的是一次读取1024个字节的数据
        data = conn.recv(1024)
        #判断发送过来的是 exit 为真则连退出循环(断开当前socket连接)
        #b'exit' 的原因是,python3中数据的传输是二进制的,上面我们在传输 msg 时也对数据进行了 .encode ,这里接受到的数据即使进行了解码也会在前面加一个b,为什么?我也不知道python怎么想的
        if  data == b'exit':
            break
        #输出解码接受到数据后打印
        print(data.decode())
        #把接受到的数据在传回去(传给客户端)
        conn.send(data)
        #再传个随机数字过去
        conn.send(str(random.randint(1,1000)).encode())
    #上面的if判断为Ture后断开当前socket连接
    conn.close()

#!/usr/bin/env python3
#@ Blog:www.zheli.ink
#@ 非阻塞型tcp socket
import  socketserver
import  random
#定义一个类
#这个类是一个固定格式,相关原因请参考官方文档(函数源代码)
#这个3个def是依次的执行的,一般情况只在 handle 里定义,原因是:当handle出现报错后,会直接跳过不会在继续执行,但是setup和finish是无论如何都会执行的
class MyServer(socketserver.BaseRequestHandler):
    #如果handle方法出现报错这会继续执行,setup和finis
    def setup(self):
        pass
    def handle(self):
        #定义连接变量
        conn = self.request
        msg = "Hello socket!"
        conn.send(msg.encode())
        while True:
            data = conn.recv(1024)
            print(data.decode())
            if data == b"exit":
                break
            conn.send(msg.encode())
            conn.send(str(random.randint(1,10000)).encode())
    def finish(self):
        pass


if __name__ == "__main__":
    #定义一个连接server
    server = socketserver.ThreadingTCPServer(("192.168.9.133", 8888), MyServer)
    #启动这个socket,
    server.serve_forever()

#!/usr/bin/env python3
#@ Blog:www.zheli.ink
#@ UDP socket
import socket

sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

ip_port = ("192.168.9.133", 8889)

sk.bind(ip_port)

while True:
    data = sk.recv(1024)
    print(data.decode())

客户端代码


#!/usr/bin/env python3
#@ Blog:www.zheli.ink
#@ tcp socket client
import socket
#实例初始化
client = socket.socket()
#定义绑定的ip:port
ip_port = ("192.168.9.133", 8888)
#连接服务器
client.connect(ip_port)
#读取连接成功后服务器返回的信息
data = client.recv(1024)
#打印
print(data.decode())
while True:
    sed_input = input("传入的数据:")
    #将 sed_input 定义的信息发送给服务器
    client.send(sed_input.encode())
    #检查自己定义的信息是否为退出信号 exit
    if sed_input == "exit":
        break
    # 读取服务器返回的第一条信息
    data = client.recv(1024)
    print(data.decode())
    # 读取服务器返回的第二条信息
    data2 = client.recv(1024)
    print(data2.decode())
    #@ PS 这里写2个收取的原因是我前面tcp socket server 的代码一共会返回2个

#!/usr/bin/env python3
import socket

sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

ip_port = ("192.168.9.133", 8889)

while True:
    msg_inprt = input("请输入发送的数据")
    if msg_inprt == "exit":
        break
    sk.sendto(msg_inprt.encode(), ip_port)
sk.close()
Last modification:June 26th, 2019 at 10:49 pm
如果觉得我的文章对你有用,请随意赞赏

One comment

  1. qwewqe

    qweqwe

Leave a Comment