• 19.tcp_upd


     1 # socket编程
     2 # 01010       ethernet(你在教室的那个位置)mark  ip(教室在哪,主机)子网    tcp,udp(端口)应用程序在哪
     3 # 物理层----》数据链路层------------------------》网络层----》  ----------》传输层 --------------------》应用层
     4 #                                                                                     Socket抽象层
     5 # pid是同一台计算机上不同进程或者线程的标识
     6 
     7 # TCP套接字
     8 import socket
     9 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 建立客户端
    10 phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 重新使用ip地址
    11 phone.bind(("127.0.0.1", 8000))  # 绑定唯一的局域网中的一个端口(挂起连接请求)
    12 phone.listen(5)  # 监听的事件
    13 print("----------->")
    14 while True:
    15     conn, addr = phone.accept()  # 就相当于链接,和电话号
    16 
    17     print("conn", conn)
    18     print("addr", addr)
    19 
    20     while True:
    21         try:
    22             msg = conn.recv(1024)  # 接收消息
    23             print("客户端发来的消息是:", msg.decode("utf-8"))
    24 
    25             conn.send(msg.upper())
    26         except Exception:
    27             break
    28     conn.close()
    29 phone.close()
     1 import socket
     2 
     3 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     4 phone.connect(("127.0.0.1", 8000))
     5 
     6 while True:
     7     msg = input("====>:").strip()
     8     if not msg:
     9         continue
    10     phone.send(msg.encode("utf-8"))
    11     print("客户端已经发送消息!")
    12     data = phone.recv(1024)
    13     print("收到服务端发来的消息:", data)
    14 
    15 phone.close()
     1 # UDP套接字
     2 from socket import *
     3 import time
     4 
     5 ip_port = ("127.0.0.1", 8080)
     6 buffer_size = 1024
     7 udp_server = socket(AF_INET, SOCK_DGRAM)  # 数据报
     8 
     9 udp_server.bind(ip_port)
    10 print("绑定成功")
    11 while True:
    12     data, addr = udp_server.recvfrom(buffer_size)
    13     print("收到客户端的消息:", data)
    14 
    15     if not data:
    16         fmt = "%Y-%m-%d %X"
    17     else:
    18         fmt = data.decode("utf-8")
    19     back_time = time.strftime(fmt)
    20 
    21     data = udp_server.sendto(back_time.encode("utf-8"), addr)
     1 # UDP套接字
     2 from socket import *
     3 
     4 ip_port = ("127.0.0.1", 8080)
     5 buffer_size = 1024
     6 
     7 udp_client = socket(AF_INET, SOCK_DGRAM)  # 数据报
     8 
     9 while True:
    10     # msg = input("----->").strip()
    11     msg = input("获取当前服务端时间:")
    12     udp_client.sendto(msg.encode("utf-8"), ip_port)  # 没有链接。多以需要指定发到哪个ip和端口
    13 
    14     data, addr = udp_client.recvfrom(buffer_size)
    15     print("收到服务端的消息:", data.decode("utf-8"))

     https://www.cnblogs.com/linhaifeng/articles/6129246.html  关于socket内核

    粘包:

    # recv在自己的缓冲区为空时,阻塞
    # recvfrom在自己的缓冲区为空时就收一个空????
    # 粘包其实就是服务端将接收到的消息执行之后,放入自己的缓冲区内,但是由于每次只能接收
    # (客户端)一部分导致,下一次输入命令的时候,会把上次为输出完的接着输出,成为粘包。
    # 粘包现象只会出现在tcp中而不会出现在udp中,是因为tcp是可靠传输(安全的)会把没有接收完的消息,
    # 继续发送;但是udp却是只接收一次(按设置的多少就是多少),缓冲区中的没有发送完的内容,他不会管
    # 有没有接受完全,(类似)覆盖掉了。


    这里还有一个我看的课程中的作业代码地址有兴趣可以看一看??https://gitee.com/maxhope8/FTP.git

  • 相关阅读:
    使用auto_prepend_file和auto_append_file
    maven导入外部jar包的方法
    scala的多种集合的使用(3)之遍历集合的方法
    scala的多种集合的使用(4)之列表List(ListBuffer)的操作
    scala的多种集合的使用(2)之集合常用方法
    UltraEdit文本行数多变一和一边多
    scala的多种集合的使用(1)之集合层级结构与分类
    用Case类生成模板代码
    寻:IE总弹出广告窗口方法? Hello
    ASP.net中提示"分析器错误""未能加载类型" Hello
  • 原文地址:https://www.cnblogs.com/liuzhanghao/p/11325912.html
Copyright © 2020-2023  润新知