用户
搜索
  • TA的每日心情
    无聊
    5 小时前
  • 签到天数: 46 天

    连续签到: 3 天

    [LV.5]常住居民I

    实习版主

    Rank: 7Rank: 7Rank: 7

    20

    主题

    120

    帖子

    906

    魔法币
    收听
    0
    粉丝
    1
    注册时间
    2016-6-28

    i春秋认证积极活跃奖

    发表于 2020-1-21 12:02:30 01155
    前言:
    笔者最近在学Python和Javascript,写一点自己的学习笔记。
    工具的出现无疑是让我们省了不少力气,但是更多的人选择了单纯的依赖工具,对本身的原理只是略知一二或者索性根本不了解,很不幸,我就是工具的深度依赖者,学习的路上因为过分依赖工具出现的坑逐渐多了起来,所以现在只能慢慢的一点一点补基础。
    正文
    那么问题来了,今天的Socket通信简单实现和我前言说的一大堆有什么关系呢?这个时候就要扯出一个很常用的工具Netcat(NC),这个工具有着瑞士军刀之名,体积小巧,具体功能介绍可看Netcat小结,Netcat就实现了一个通讯的功能,笔者今天的文章简单的用Python实现一下此功能。
    和NC一样,分两个端,一个Server.py为服务端,一个Client.py为客户端
    下面为两个端的编写所需要的大致思路
    Server端
    • 创建Socket
    • 绑定端口
    • 等待连接
    • 开始通讯
    • 关闭连接
    Client端
    • 创建Socket
    • 连接目标
    • 开始通讯
    • 关闭连接
    好,既然这样,那我们就开始实现吧!
    首先我们先要
    • [Python] 纯文本查看 复制代码
      from socket import * #调用Socket

    复制
    Wait!我都开始写文了,这么简单的脚本我当然是已经写出来了
    Server.py
    • [Python] 纯文本查看 复制代码
      from socket import * #调用Socket
      address = ('localhost',666)
      s = socket(AF_INET,SOCK_STREAM) #服务器之间网络通信,流式socket , for TCP
      s.bind(address)#前面ip为空则为本地地址
      s.listen(1) #开始TCP监听,监听一个请求
      print("Wait For Connect")
      conn,addr = s.accept()#前面为套接字,后面为对方机器的ip地址
      print("Connected By",addr)
      #发送信息
      while True:
          data = str(conn.recv(1024),'utf-8')#接收1024字节的字符串
          print("收到---->",data)
          data = input("发送---->")
          conn.send(data.encode())
      conn.close()
      s.close()

    复制
    Client.py
    • [Python] 纯文本查看 复制代码
      from socket import *
      address = ('localhost',666)
      s = socket(AF_INET,SOCK_STREAM) #服务器之间网络通信,流式socket , for TCP
      s.connect(address)
      while True:
          data = input("发送---->")
          s.send(data.encode())
          recv = str(s.recv(1024),'utf-8')
          print("接收---->",recv)
      s.close()
      

    这个时候得注意一个坑,Python3默认的Str编码为unicode,如果我们直接这样传输字符串的话,接收到的内容都会是这样
    • b'String'
    复制
    虽说字符串的的确确已经正常输出了,但是还是要注意规范,解决起来还是蛮简单的,转成Utf-8即可
    • Str('string','utf8')
    复制
    注意:服务端与客户端不能直接发送列表,元组,字典。需要字符串化repr(data)。

    My blog :http://www.e-wolf.top
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册