网络与TCP

2021-03-12  本文已影响0人  吃可爱长大鸭

目录

1.socket服务端
2.socket客户端
3.TCP基础版
4.TCP循环版
5.TCP异常处理
6.半链接池
7.UDP模板

1.socket服务端

"""
    socket是什么?

    socket是Python提供的一个模块   当然其他的任何语言也都有

    用于处理网络传输相关的操作  其实就是封装了
    底层复杂 丑陋的TCP和UDP协议
    对外提高简单 优雅的使用接口

    socket的作用?
        减少网络编程的工作量

    如何使用socket模块
"""
import socket

# 默认使用的是TCP协议
# 创建socket对象


# CS构架的程序必然有客户端程序 和 服务器端程序
# 为了统一使用方式  服务器端和客户端使用的都是socket


soc = socket.socket()

# 作为服务器放必须为socket指定 ip和端口号
soc.bind(("192.168.12.141",1988))   # 端口不能超过65535   明确饭店地址

# 开始监听端口  相当于饭店开门了 等着顾客来
soc.listen()

# 接收客户端的连接请求
client,address = soc.accept()


# 接收
data = client.recv(1024)

print(data.decode("utf-8"))

# 发送
client.send("我是你的服务器 ".encode("utf-8"))

# 要注意 在服务端  收发数据是客户端socket来完成的  服务器端的sock 只做处理连接
# 收发数据都是bytes类型

# 关闭socket 回收资源
soc.close()

2.socket客户端

import socket

# 创建socket对象
client = socket.socket()

# 连接服务器
client.connect(("192.168.12.141",1988)) # 就是在做三次握手

# 收发数据
client.send("你好".encode("utf-8"))

data = client.recv(1024)
print(data.decode("utf-8"))

# 关闭连接
client.close()  # 在做四次挥手操作

3.TCP基础版

#服务端
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("==========")

print("收到客户端发来的数据:%s" % data.decode("utf-8"))

# 发生的数据必须为bytes类型
client.send(data)


client.close() #挂断电话

server.close() # 关机

#客户端
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()

4.TCP循环版

#服务端
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()
                break

            print("收到客户端发来的数据:%s" % data.decode("utf-8"))
            client.send(data)
        except ConnectionResetError:
            print("客户端强行关闭了连接")
            client.close()
            break
client.close() #挂断电话
server.close() # 关机

#客户端
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"))

5.TCP异常处理

#服务端
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)
        if not data:
            print("对方已经关闭.....")
            break
        print(data.decode("utf-8"))
        client.send(data.upper())
    except ConnectionResetError:
        print("对方异常关闭连接...")

client.close()
server.close()

#客户端
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()

6.半链接池

import  socket

server = socket.socket()

server.bind(("127.0.0.1",8888))

# 参数可以设置最大的半连接数   最大5个
server.listen()

import time
while True:
    time.sleep(0.5)


# while True:
#     # client,addr = server.accept()
#
#     while True:
#         try:
#             data = client.recv(1024)
#             if not data:
#                 print("对方已经关闭.....")
#                 client.close()
#                 break
#             print(data.decode("utf-8"))
#             client.send(data.upper())
#         except ConnectionResetError:
#             print("对方异常关闭连接...")
#             client.close()
#             break

# client.close()
server.close()

#客户端
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"))

7.UDP模板

# 服务端
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()

#客户端
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()
上一篇下一篇

猜你喜欢

热点阅读