1对1单次发送接受信息
(客户端)
from socket import socket
# import datetime
#1.创建一个中间体socket,链接客户端和服务端的数据传输
client_soc=socket()
#2.与服务端建立连接
client_soc.connect(("192.168.2.21",2022))
print('与服务器已建立链接,可以发送信息')
# ti1=datetime.datetime.today()
# print(ti1)
#3.发送数据
msg='你好,python'
client_soc.send(msg.encode("utf-8")) #发送的数据是字符串,需要进行转码成字节才能被识别
print('信息已经发送成功')
# ti2=datetime.datetime.today()
# print(ti2)
# print(ti2-ti1)
(服务端)
from socket import socket
#1.创建一个中间体socket,链接客户端和服务端的数据传输
server_soc=socket()
#2.绑定(ip,端口)
server_soc.bind(("192.168.2.21",2022)) #元组格式
#3.开始监听
server_soc.listen()
print('服务器已启动')
#4.接受客户端的链接
soct,ip=server_soc.accept()
#5.读取客户端的数据
print(ip)
data=soct.recv(1024) #传输过来的数据均是以二进制的字节显示,需要转码
print(data)
data=data.decode("utf-8")
print(f"来自客户端{ip}的消息:{data}")
1对1循环发送接受信息
(客户端)
from socket import socket
# import datetime
#1.创建一个中间体socket,链接客户端和服务端的数据传输
client_soc=socket()
#2.与服务端建立连接
client_soc.connect(("192.168.2.21",2024))
print('与服务器已建立链接,可以发送信息')
# ti1=datetime.datetime.today()
# print(ti1)
#3.发送数据
while True:
msg=input('客户端输入信息:')
client_soc.send(msg.encode("utf-8")) #发送的数据是字符串,需要进行转码成字节才能被识别
print('信息已经发送成功')
# ti2=datetime.datetime.today()
# print(ti2)
# print(ti2-ti1)
(服务端)
from socket import socket
#1.创建一个中间体socket,链接客户端和服务端的数据传输
server_soc=socket()
#2.绑定(ip,端口)
server_soc.bind(("192.168.2.21",2024)) #元组格式
#3.开始监听
server_soc.listen()
print('服务器已启动')
#4.接受客户端的链接
soct,ip=server_soc.accept()
#5.读取客户端的数据
while True:
print(ip)
data=soct.recv(1024) #传输过来的数据均是以二进制的字节显示,需要转码
print(data)
data=data.decode("utf-8")
print(f"来自客户端{ip}的消息:{data}")
1对多循环发送接受信息
(客户端)
from threading import Thread
from socket import socket
# import datetime
class TcpClient:
def __init__(self):
#1.创建一个中间体socket,链接客户端和服务端的数据传输
self.client_soc=socket()
#2.与服务端建立连接
self.client_soc.connect(("192.168.2.51",5003))
print('与服务器已建立链接,可以发送信息')
self.send_data()
# ti1=datetime.datetime.today()
# print(ti1)
def send_data(self):
#3.发送数据
while True:
msg=input('客户端输入信息:')
self.client_soc.send(msg.encode("utf-8")) #发送的数据是字符串,需要进行转码成字节才能被识别
print('信息已经发送成功')
# ti2=datetime.datetime.today()
# print(ti2)
# print(ti2-ti1)
if __name__ == '__main__':
tcpcl=TcpClient()
(服务端)
from socket import socket
from threading import Thread
class TcpServer:
def __init__(self):
#1.创建一个中间体socket,链接客户端和服务端的数据传输
server_soc=socket()
#2.绑定(ip,端口)
server_soc.bind(("192.168.2.21",2029)) #元组格式
#3.开始监听
server_soc.listen()
print('服务器已启动')
#4.接受客户端的链接
#read_data()这个方法循环读取数据,如果不结束,那么服务器socket就不能继续下一个客户端
#怎么办呢?一个客户端,开启一个线程来读数据.服务器socket继续接受下一个客户端的请求
while True:
soct,ip=server_soc.accept()
tp=Thread(target=self.read_data,args=(soct,ip))
tp.start()
def read_data(self,soct,ip):
#5.读取客户端的数据
while True:
#print(ip)
data=soct.recv(1024) #传输过来的数据均是以二进制的字节显示,需要转码
#print(data)
data=data.decode("utf-8")
if data:
print(f"来自客户端{ip}的消息:{data}")
else:
break
if __name__ == '__main__':
tcpser=TcpServer()
多对多群聊循环发送接受信息
(客户端)
from socket import socket
from threading import Thread
class TcpClient:
def __init__(self):
#1. 创建一个socket
self.client_soc =socket()
#2. 与服务器建立连接
self.client_soc.connect(("192.168.2.51",5005) )
# self.send_data() # 发数据
# 一个线程 循环发消息
# 一个线程 循环读消息
Thread(target=self.send_msg).start()
Thread(target=self.read_msg).start()
# 发消息
def send_msg(self):
while True:
# (1) 发消息
msg = input("客户端说:")
self.client_soc.send(msg.encode("utf-8")) # 数据转为字节码
# 收消息
def read_msg(self):
while True:
# (2)读取服务器回发的消息
rev_msg = self.client_soc.recv(1024)
print(rev_msg.decode("utf-8"))
if __name__ == '__main__':
tcpcl=TcpClient()
(服务端)
from socket import socket
from threading import Thread
users = [] #全局 保存 连接的客户端对象即客户端socket
class TcpServer:
def __init__(self):
# 1. 创建一个socket
server_soc = socket()
# 2. 绑定(IP,端口)
server_soc.bind(("192.168.2.51", 5005))
# 3. 开始监听
server_soc.listen()
print("服务器已启动")
# 4. 接受客户端的连接 等待
#-------程序顺序向下执行 那么一个服务器只能与一个客户端建立连接--------
#soct, ip = server_soc.accept()
#self.read_data( soct, ip)
#--------服务器怎样才能接受多个客户端的连接:循环--------------------
# while True:
# soct, ip = server_soc.accept()
# self.read_data(soct, ip)
#read_data()这个方法循环读数据,如果不结束,那么服务器socket就不能继续接受下一个客户端的请求
#怎么办?一个客户端 开启一个线程来读数据。 服务器socket继续接受下一个客户端的请求
#-----------------------------------------------------------
while True:
soct, ip = server_soc.accept()
# =====================================
# 把连接的客户端的socket保存到users列表中
users.append(soct)
# 群发:XXX上线了
msg = f"\n{ip}上线了"
for sc in users:
sc.send(msg.encode("utf-8"))
# ======================================
t=Thread(target=self.read_data, args=( soct, ip ))
t.start()
#------------------------------------------------------------
def read_data(self, soct, ip):
#5. 读取客户端的数据
while True:
try:
data = soct.recv(1024)
# 收消息 解码 decode('utf-8')
data = data.decode('utf-8')
if data == "":
break
print(f"收到客户端{ip}消息:{data}")
# 发消息
soct.send(f"\n服务器已收到{ip}的消息".encode("utf-8"))
# ===========================================
# 当收到某个客户端的消息后,给每个客户端发消息
msg = f"\n客户端{ip}说:{data}"
for sc in users:
sc.send(msg.encode("utf-8"))
# =========================================
except:
print(f"客户端【{soct}】断开连接")
users.remove(soct)
# 群发:XXX下线了
msg = f"\n{ip}下线了"
for sc in users:
sc.send(msg.encode("utf-8"))
break
if __name__ == '__main__':
tcpser=TcpServer()
UDP 1对1单次发送接受信息
# 1.创建socket对象
# 2. 发送消息 sendto(数据,("ip",端口))
# 创建socket对象
#soct =socket.socket( family= XXX , type=XX )
# 地址簇family: AF_INET--面向网络 默认是面向网络 AF_INET
# AF_UNIX--基于文件的
# 类型type: SOCK_STREAM 基于TCP的,可靠数据传输 默认是基于TCP SOCK_STREAM
# SOCK_DGRAM 基于UDP的,用于局域网,在网络上发广播信息。
(客户端)
import socket
class UdpClient:
def __init__(self):
# 1.创建一个socket对象
client_soc = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
# 2.发送数据
while True:
msg=input('客户端输入信息:')
msg=msg.encode("utf-8") # 发送的数据是字符串,需要进行转码成字节才能被识别
client_soc.sendto(msg,("192.168.2.21", 2030))
print('信息已经发送成功')
if __name__ == '__main__':
udpcli=UdpClient()
(服务端)
import socket
class UdpServer:
def __init__(self):
#1.创建一个socket对象
server_soc=socket.socket(family=socket.AF_INET,type=socket.SOCK_DGRAM)
# 2.绑定(ip,端口)
server_soc.bind(("192.168.2.21", 2030)) # 元组格式
print('服务器已启动')
#3.读取客户端的数据
while True:
data,ip=server_soc.recvfrom(1024) #传输过来的数据均是以二进制的字节显示,需要转码
#print(data,ip)
data=data.decode("utf-8")
print(f"来自客户端{ip}的消息:{data}")
if __name__ == '__main__':
udpser=UdpServer()