• 发文
  • 评论
  • 微博
  • 空间
  • 微信

python修炼 - UDP、TCP

QYFabc 2019-02-19 09:26 发文






本文阅读时长大约为 6 分钟





今日内容概述:

网络通讯概述、udp聊天器、tcp服务器和客户端




今日思维导图












每日代码


udp聊天器



import socket

"""
这段代码可以实现循环进行收发消息,但是同一时间只能进行一个动作
"""

def send_msg(udp_socket):
   """发送数据"""

   # 发送数据
   client_ip = input("请输入对方ip: ")
   client_port = int(input("请输入对方端口:"))
   send_data = input("请输入要发送的内容:")
   # 发送数据,使用encode进行编码,ip和端口要放在元组中
   udp_socket.sendto(send_data.encode("utf-8"), (client_ip, client_port))


def recv_msg(udp_socket):
   """接收数据"""

   # 接收数据 ,需要指定要接收的字节,1024就是 1KB
   recv_data = udp_socket.recvfrom(1024)
   # recvfrom返回的数据时一个元组,第一个元素是地址,第二个元素是接收到的消息
   # 使用decode 进行解码
   print("%s: %s" % (str(recv_data[1]), recv_data[0].decode("utf-8")))


def main():
   # 创建套接字
   udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

   # 绑定本地信息,可以知道ip和端口
   udp_socket.bind(("", 6666))

   while True:

       print("---udp聊天器---")
       print("1. 发送数据")
       print("2. 接收数据")
       print("0. 退出")

       op = input("请输入要进行的操作")

       if op == "1":

           # 调用发送数据的函数
           send_msg(udp_socket)
       elif op == "2":
           # 调用接收数据的函数
           recv_msg(udp_socket)

       elif op == "0":
           break

       else:
           print("输入有误,请重新输入")

   udp_socket.close()


if __name__ == "__main__":
   main()





tcp服务器代码


import socket


"""tcp服务器"""


def main():

   # 创建套接字, tcp的参数时SOCK_STREAM
   tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

   # 绑定本地地址, 本地地址和端口可能需要重新指定
   tcp_socket.bind(("", 6666))

   # 由主动变成被动接听, listen方法可以指定同时连接的客户端
   tcp_socket.listen(128)

   while True:
       # 循环接听客户
       # 等待客户端连接, 当有客户连接,accept方法返回一个元组    
       # 元组第一个元素是一个新的套接字,只针对于当前连接的这个客户端;第二个元素是客户端地址 
       colient_socket, colient_addr = tcp_socket.accept()

       # 接收数据
       print(colient_addr)
       while True:
           # 循环和同一个客户端联系
           colient_data = colient_socket.recv(1024)
           print(colient_data.decode("utf-8"))

           if colient_data:
      
               # 进行判断,只有客户端还在发送数据,就返回一个数据给客户端
               # 发挥一部分数据给客户端
               colient_socket.send("嘿嘿嘿".encode("utf-8"))
           else:
              # 没有数据就
               break

       # 关闭套接字
       colient_socket.close()

   tcp_socket.close()


if __name__ == "__main__":
   main()




tcp客户端代码



import socket


"""tcp客户端"""


def main():
   # 创建套接字
   tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

   # 链接服务器,  tcp客户端需要先链接服务器
   tcp_socket.connect(("192.168.xxx.xxx", 6666))

   while True:
       # 循环和服务器联系
       # 发送数据
       print("输入【exit】退出链接")
       send_data = input("请输入要发送的数据:")
       if send_data == "exit":
           break
       tcp_socket.send(send_data.encode("utf-8"))

       # 接收服务器返回的数据
       server_data = tcp_socket.recv(1024)
       print(server_data.decode("utf-8"))

   # 关闭套接字
   tcp_socket.close()


if __name__ == "__main__":
   main()




在 tcp 这里碰见了一个奇怪的BUG

服务器和客户端运行起来后,输入正常数据没有问题,当只输入一个回车时,程序不发送数据也不接受数据只能强行接受,问了下,没有解决,这玩意好像是因为操作系统底层的原因。。。。 后面再研究研究。






今天内容需要记忆和理解都比较多,不过还算可以接受。


最近在试着使用 Typora 练习 Markdown 写作方式,不是很熟练,写出来有点乱,慢慢练习熟练了再使用这种方式吧。 




END




        







声明:本文为OFweek维科号作者发布,不代表OFweek维科号立场。如有侵权或其他问题,请及时联系我们举报。
2
评论

评论

    相关阅读

    暂无数据

    QYFabc

    python 学习分享...

    举报文章问题

    ×
    • 营销广告
    • 重复、旧闻
    • 格式问题
    • 低俗
    • 标题夸张
    • 与事实不符
    • 疑似抄袭
    • 我有话要说
    确定 取消

    举报评论问题

    ×
    • 淫秽色情
    • 营销广告
    • 恶意攻击谩骂
    • 我要吐槽
    确定 取消

    用户登录×

    请输入用户名/手机/邮箱

    请输入密码