tcp/udp协议代码实现

day 29

一、TCP协议代码实现

1、基础版:

-------------socket.serve-------
import socket
​
# 买手机 默认得到是一个TCP的socket
server = socket.socket()
# 两行代码的效果是一样的
# socket的家族   AF_INET
# socket的类型
# SOCK_STREAM 对应的是TCP     SOCK_DGRAM 对应的是UDP
# server = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)
# 床架基于UDP的socket
# server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
​
server.bind(("127.0.0.1",16888))  # 绑定手机卡
server.listen() # 开始待机
# 得到对方的socket对象与地址
client,addr = server.accept() # 接收通话请求 # 该函数会阻塞 直到有连接请求过来
​
​
print("==========")
# buffersize 表示应用程序的缓冲区大小     recv其实是 从系统缓冲区读取数据到应用程序
data = client.recv(1024)   # 该函数会阻塞 直到操作缓冲区有数据位置
print("==========")
​
-----------------socket.client----------------
import socket
​
client = socket.socket()
client.connect(("127.0.0.1",16888))
client.send("hello 服务器".encode("utf-8"))
​
print("===================")
data = client.recv(1024)   # 该函数会阻塞 直到操作缓冲区有数据位置
print("===================")
print("收到服务器:%s" % data.decode("utf-8"))
​
client.close()
 

2、TPC异常处理版:

---------------socket.serve-------------
import  socket
​
server = socket.socket()
server.bind(("127.0.0.1",8888))
server.listen()
​
client,addr = server.accept()
​
while True:
    try:
        data = client.recv(1024)   #win状态下客户端异常关闭,会抛出错误
        if not data:               #如果是linux 不会抛出异常 会死循环收到空的数据包
            print("对方已经关闭.....")
            break
        print(data.decode("utf-8"))
        client.send(data.upper())
    except ConnectionResetError:
        print("对方异常关闭连接...")
​
client.close()
server.close()
​
---------------socket.client-------------
import  socket
​
client = socket.socket()
client.connect(("127.0.0.1",8888))
client.send("hello".encode("utf-8"))
data = client.recv(1024)
print(data.decode("utf-8"))
​
client.close()

 

3、半连接池:

----------socket.serve--------
import  socket
​
server = socket.socket()
server.bind(("127.0.0.1",8888))
# 参数可以设置最大的半连接数   最大5个
server.listen(5)
​
import time
while True:
    time.sleep(0.5)
​
server.close()
​
---------socket.client---------import  socket
​
client = socket.socket()
client.connect(("127.0.0.1",8888))
​
while True:
    client.send(input(">>:").encode("utf-8"))
    data = client.recv(1024)
    print(data.decode("utf-8"))
​
client.close()

4、循环收发:

-------------------socket.serve-----------
import socket
​
# 买手机 默认得到是一个TCP的socket
server = socket.socket()
​
# 两行代码的效果是一样的
# socket的家族   AF_INET
# socket的类型
# SOCK_STREAM 对应的是TCP     SOCK_DGRAM 对应的是UDP
# server = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)
# 创建基于UDP的socket
# server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
​
​
server.bind(("127.0.0.1",16888))  # 绑定手机卡
​
server.listen() # 开始待机
# 连接循环 可以不断接受新连接
while True:
    client, addr = server.accept()
​
    # 通讯循环 可以不断的收发数据
    while True:
        try:
            # 如果是windows 对方强行关闭连接 会抛出异常
            # 如果是linux 不会抛出异常 会死循环收到空的数据包
            data = client.recv(1024)
            if not data:
                client.close()
                breakprint("收到客户端发来的数据:%s" % data.decode("utf-8"))
            client.send(data)
        except ConnectionResetError:
            print("客户端强行关闭了连接")
            client.close()
            break
client.close() #挂断电话
server.close() # 关机
---------------socket.client--------------
import socket
​
client = socket.socket()
client.connect(("127.0.0.1",16888))
while True:
    msg = input(">:")
    client.send(msg.encode("utf-8"))
    data = client.recv(1024)
    print("收到服务器:%s" % data.decode("utf-8"))
client.close()

 

二、UDP协议代码实现:

------------------socket.serve--------------
import socket
​
# UDP协议 在创建socket是 只有一个类型不同
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,proto=0)
server.bind(("127.0.0.1",8888))
​
while True:
    data,addr = server.recvfrom(1024) # 阻塞 直到收到数据为止
    print("收到来自%s的消息:%s" % (data.decode("utf-8"),addr[0]))
    # 返回值为 数据 和 对方ip地址 和端口号
    server.sendto(data.upper(),addr)
​
print(res)
server.close()
​
---------------socket.client1--------------
import socket
​
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
​
while True:
    data = input(">>:").encode("utf-8")
    client.sendto(data,("127.0.0.1",8888))
    d,addr = client.recvfrom(1024)
    print(d.decode("utf-8"))
​
client.close()
​
------------socket.client2--------------
import socket
​
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
​
while True:
    data = input(">>:").encode("utf-8")
    client.sendto(data,("127.0.0.1",8888))
    d,addr = client.recvfrom(1024)
    print(d.decode("utf-8"))
​
client.close()

 

 

posted @ 2018-12-25 19:45  zhao_peng  阅读(1027)  评论(0编辑  收藏  举报