socket server
#-*- coding:utf-8 -*- import socket #ss = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建一个 IPv4 的tcp socket ss 对象 ip = '127.0.0.1' port = 6789 ip_port = (ip,port) ss = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建套接字 ss.bind(ip_port) #绑定服务端口 ss.listen(5) #监听连接请求 print('------------------------********------------------------------------') print('启动 socket 服务, 等待连接....') conn,address = ss.accept() #等待连接,此处自动阻塞 #被动接受客户端连接,(阻塞式)等待连接的到来,并返回(conn,address)二元元组,其中conn是一个通信对象,可以用来接收和发送数据。address是连接客户端的地址。 # conn 是服务端 对应的套接字 print(conn) print('------------------------********------------------------------------') print(address) print('------------------------********------------------------------------') while True: client_data = conn.recv(1024).decode() #接收数据包,并且用 decode() 进行解码,socket 通信通过 bytes 进行传输 if client_data == 'exit': # 判断是否退出连接 exit('通信结束') print('来自地址: %s 的客户端发送了: %s' % (address, client_data)) inp = input('回复的内容:').encode() conn.sendall(inp) #响应信息 并进行编码 conn.close() #关闭连接
socket client
#-*- coding:utf-8 -*- import socket ip = '127.0.0.1' port = 6789 ip_port = (ip,port) cs = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建 套接字 cs.connect(ip_port) while True: # 通过一个死循环不断接收用户输入,并发送给服务器 inp = input('请输入要发送的内容: '.strip()) #strip 消除内容左右的空格 if not inp: #如果不为真 continue cs.sendall(inp.encode()) #发送数据,并且进行编码为 bytes if inp == 'exit': print('通信结束') break server_reply = cs.recv(1024).decode() #接收服务的响应,并且解码 print(server_reply) cs.close()
多线程
# -*- coding:utf-8 -*- import socket import threading # 导入线程模块 def link_handler(link, client): """ 该函数为线程需要执行的函数,负责具体的服务器和客户端之间的通信工作 :param link: 当前线程处理的连接 :param client: 客户端ip和端口信息,一个二元元组 :return: None """ print("服务器开始接收来自[%s:%s]的请求...." % (client[0], client[1])) while True: # 利用一个死循环,保持和客户端的通信状态 client_data = link.recv(1024).decode() if client_data == "exit": print("结束与[%s:%s]的通信..." % (client[0], client[1])) break print("来自[%s:%s]的客户端向你发来信息:%s" % (client[0], client[1], client_data)) link.sendall('服务器已经收到你的信息'.encode()) link.close() ip_port = ('127.0.0.1', 9999) sk = socket.socket() # 创建套接字 sk.bind(ip_port) # 绑定服务地址 sk.listen(5) # 监听连接请求 print('启动socket服务,等待客户端连接...') while True: # 一个死循环,不断的接受客户端发来的连接请求 conn, address = sk.accept() # 等待连接,此处自动阻塞 # 每当有新的连接过来,自动创建一个新的线程, # 并将连接对象和访问者的ip信息作为参数传递给线程的执行函数 t = threading.Thread(target=link_handler, args=(conn, address)) t.start()
UDP
# 服务端 import socket ip_port = ('127.0.0.1', 9999) sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0) sk.bind(ip_port) while True: data = sk.recv(1024).strip().decode() print(data) if data == "exit": print("客户端主动断开连接!") break sk.close() # 客户端 import socket ip_port = ('127.0.0.1', 9999) sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0) while True: inp = input('发送的消息:').strip() sk.sendto(inp.encode(), ip_port) if inp == 'exit': break sk.close()