TCP数据传输过程模拟

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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值