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