网络编程基础(下)

news/2024/5/18 14:42:02 标签: 网络, udp, 服务器

7 udp套接字示例

7.1 udp简单示例

import socket
ip_port = ('127.0.0.1', 9000)

# 创建一个服务器的套接字
udp_server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

# 绑定服务器套接字
udp_server.bind(ip_port)

# 接受客户端的信息
msg, addr = udp_server.recvfrom(1024)
print(msg, addr)

# 发送信息
udp_server.sendto("hello".encode(), addr)
import socket
ip_port = ('127.0.0.1', 9000)

# 创建一个客户端套接字
udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 输入发送的数据
msg = input('>>: ').strip()

# 发送信息给服务器
udp_client.sendto(msg.encode('utf-8'), ip_port)

# 接受服务器的信息
back_msg, addr = udp_client.recvfrom(1024)
print(back_msg.decode('utf-8'), addr)

7.2 udp聊天器示例

import socket
ip_port = ('127.0.0.1', 8081)
# 创建一个服务器套接字
udp_server_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定IP地址和端口号
udp_server_sock.bind(ip_port)

# 循环收发消息
while True:
    # 接收
    qq_msg, addr = udp_server_sock.recvfrom(1024)
    print('来自[%s:%s]的一条消息:%s' % (addr[0], addr[1], qq_msg.decode('utf-8')))
    # 发送
    back_msg = input('回复消息: ').strip()
    udp_server_sock.sendto(back_msg.encode('utf-8'), addr)
import socket

udp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

qq_name_dic = {
    '乔治': ('127.0.0.1', 8081),
    'james': ('127.0.0.1', 8082),
    '苯环': ('127.0.0.1', 8083),
    '岳岳': ('127.0.0.1', 8084),
}

while True:
    qq_name = input('请选择聊天对象: ').strip()
    while True:
        msg = input('请输入消息,回车发送: ').strip()
        if msg == 'quit':
            break
        if not msg or not qq_name or qq_name not in qq_name_dic:
            continue
        udp_client_socket.sendto(msg.encode('utf-8'), qq_name_dic[qq_name])

        back_msg, addr = udp_client_socket.recvfrom(1024)
        print('来自[%s:%s]的一条消息:%s' % (addr[0], addr[1], back_msg.decode('utf-8')))

8 tcp套接字示例

tcp是基于连接的,必须先启动服务器,然后在启动客户端去连接服务器

8.1 tcp套接字工作原理

8.2 tcp简单示例

  • tcp服务端

import socket

ip_port = ('127.0.0.1', 9000)  # 电话卡

# 创建服务器套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 把地址绑定给套接字
s.bind(ip_port)
# 监听链接
s.listen(5)

# 接受客户端连接
conn, addr = s.accept()
# print(conn)
# print(addr)
print('接到来自%s的电话' % addr[0])

# 对话
msg = conn.recv(1024)
print(msg.decode(), type(msg))
conn.send("hi".encode())

conn.close()  # 关闭客户端套接字
s.close()  # 关闭服务器套接字
  • tcp客户端

import socket

ip_port = ('127.0.0.1', 9000)

# 创建客户端套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 尝试连接服务器
s.connect_ex(ip_port)

#对话
s.send('hello world'.encode('utf-8'))
feedback = s.recv(1024)
print(feedback.decode('utf-8'))

# 关闭客户端套接字
s.close()

8.3 tcp改进示例

  • tcp服务端改进版

import socket
ip_port = ('127.0.0.1', 8081)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(ip_port)
s.listen(5)

while True:
    conn, addr = s.accept()
    # print(conn)
    # print(addr)
    print('接到来自%s的电话' % addr[0])
    while True:
        msg = conn.recv(1024)
        print(msg.decode(), type(msg))
        str = input(">>>")
        conn.send(str.encode())
    conn.close()
  • tcp客户端改进版

import socket
ip_port = ('127.0.0.1', 8081)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect_ex(ip_port)

while True:
    msg = input('>>: ').strip()
    if len(msg) == 0:
        continue
    s.send(msg.encode('utf-8'))

    feedback = s.recv(1024)
    print(feedback.decode('utf-8'))

s.close()

9 tcp的三次握手四次挥手(面试常考)

  • 流程图

  • 术语

  • SYN:同步位,SYN=1,表示进行一个连接请求。

  • ACK:确认位,ACK=1,确认有效,ACK=0,确认无效。

  • ack:确认号,对方发送序号+1。

  • seq:序号。

  • FIN:断开连接并且会停止发送数据。


http://www.niftyadmin.cn/n/148095.html

相关文章

华为OD机试 -静态扫描最优成本(Java) | 机试题+算法思路+考点+代码解析 【2023】

静态扫描最优成本 题目 静态扫描快速识别源代码的缺陷,静态扫描的结果以扫描报告作为输出: 文件扫描的成本和文件大小相关,如果文件大小为 N ,则扫描成本为 N 个金币扫描报告的缓存成本和文件大小无关,每缓存一个报告需要 M 个金币扫描报告缓存后,后继再碰到该文件则不…

蓝桥冲刺31天之白色情人节

生活再平凡,也是限量版 总要热爱着什么,才不会被这无趣的生活吞没 若心有所向,平凡的日子也会泛着光 心怀浪漫宇宙,也珍惜人间日常 A:卡片 题目描述: 小蓝有很多数字卡片,每张卡片上都是数字 0…

华为OD机试 -找出符合要求的字符串子串(Java) | 机试题+算法思路+考点+代码解析 【2023】

找出符合要求的字符串子串 题目 给定两个字符串,从字符串2中找出字符串1中的所有字符,去重并按照ASCII值从小到大排序 输入字符串1:长度不超过1024 输入字符串2:长度不超过1000000 字符范围满足ASCII编码要求,按照ASCII的值由小到大排序 输入描述: bach bbaaccedfg…

手写promise原理系列二:手写promise的关键逻辑梳理,promise用法原理

文章目录一、如何改变promise的状态?二、一个promise指定多个成功或失败回调,都会调用么?三、改变promise状态和then中的回调函数谁先执行谁后执行?四、promise.then() 返回的 promise 对象的结果由什么决定?五、promi…

初探Java+TestNG自动化测试

最近看到测试组在搭建TestNG框架,周末在家,本地搭建,方便备查。 测试是程序上线的最后一道关,关于测试的三个重要观点。 1)测试是为了证明程序有错,而不是证明程序无错误; 2)一个好的…

【力扣-SQL】非会员剩余题 刷题知识点总结

之前刷完了SQL入门的十天打卡计划,链接如下:https://leetcode.cn/study-plan/sql/?progressjgmzq5s,刷题知识点总结在:【力扣-SQL入门】10天刷题 知识点总结这篇文章主要记录一下剩下的、非会员的SQL题(一共8题&#…

【Unity-c#专题篇】之c#入门篇

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

QML视图(PathView)

PathView(路径视图) PathView 显示从内置 QML 类型(如 ListModel 和 XmlListModel)创建的模型的数据,或者在从 QAbstractListModel 继承的C中定义的自定义模型类。 视图有一个模型(定义要显示的数据&…