zoukankan      html  css  js  c++  java
  • python socket使用

    自学python,先在菜鸟教程网自学,然后买了本书看。又从同事那里淘到了某个培训学校python教学视频,查缺补漏。视频是用python3.0讲的,讲解的很不错,中间有让写作业,这个我很喜欢。这几天看的是socket。书中和网站上讲的很笼统,教学视频写了一个用例,讲解的很不错,然后自己就写了几遍,发现很多问题,总结一下。

    先说下我的问题。

    问题一:

      第一次写的时候,知道步骤,但就是写不出来。

      总结:在看视频的时候,觉得很简单,会了,就没自己写一遍,直到自己写的时候才发发现自己不会,典型的眼高手低。

    问题二:

      然后就是对着菜鸟教程的例子,写了一遍,报错,看了下报错日志,我首先想的不是我为什么错了,而是赶紧对照人家网站例子,看是不是我哪里写不一样,从来没有怀疑过是网站的代码本身有问题,后来证明确实是网站代码有问题,是没有encode造成的。

      总结:错了就看日志报错的原因,顺着原因去解决,很轻松,权威有时候也会打盹啊。

    问题三:

      然后写视频中的例子,这个还是有点难度的,写第一遍的时候,感觉乱七八糟的。一开始写的时候,还很顺利,结果后面问题不断,然后问题多的就写不下去了,就对着例子写。成功后就删了重写第二遍,清晰了很多。过了一周,我写第三遍,我把我当成讲师,在讲解这个例子。然后问题来了。我客户端发送查询命令,服务端返回数据,结果是第一次什么也不返回,第二次输出第一次的数据。我在服务端各种打输出,确定服务端没问题,那问题就出在客户端了。细看了一遍,也没问题啊。然后对比客户端与服务端接受发送条令,发现服务端有两个输出,而客户端只有一个接受数据指令。客户端第一个接收指令接受的是长度,第二个接受的是数据。一开始我以为客户端的接收指令接收的就是数据,其实是长度,只是我当时脑子轴了,以为那个长度就是数据,一直找了一两个小时才发现。当时真想给自己两巴掌。注意一下,这里的两个接收指令不能写反,是与服务端按顺序接收数据的。

      总结:把别人的例子,自己吃透了,才是自己,纯粹的抄写是不行,只有自己融会贯通才行。

    问题四:客户端close(),在pycharm,提示:This inspection detects code which can not be normally reached,即:此行代码运行的时候无法达到。后来经过研究,发现是因为While True 这个循环没有结束,只要进行判断,进行一个break就行了。

      先上图一张,网上搜的,讲解的很明确,所以粘贴上来,让大家看看

    代码部分:

    server端:

    import socket  ,os
    server = socket.socket()
    # host = socket.gethostname()
    # client.connect(('localhost',9999))
    server.bind(('localhost',9999))
    server.listen(2)
    while True:
    print('等待客户端连接。。。。')
    recip,addr = server.accept()
    while True:
    print('33[1;34;0m地址是33[0m',addr)
    data = recip.recv(1024)
    if not data:
    print('33[1;38;0m客户端 has lost...33[0m')
    break
    msg_res = os.popen(data.decode('utf-8')).read()
    print('33[1;32;0m发送到客户端的内容为: 33[0m',msg_res)
    recip.send(str(len(msg_res)).encode())
    recip.send(msg_res.encode())
    print('33[1;33;0m发送到客户端的内容为: 33[0m', msg_res.encode())
    print('33[1;35;0m发送数据的长度:33[0m',len(msg_res))
    server.close()
    print('server 运行结束!')

    client端:


    from socket import *
    import asyncio

    client_socket = socket()
    host = gethostname()
    client_socket.connect(('localhost',9998))

    while True:
    cmd = input('输入你要查询的内容:').strip()
    client_socket.send(cmd.encode("utf-8"))
    if len(cmd) == 0:continue
    #接受数据的顺序不能写反
    data_len = client_socket.recv(1024)
    receive_size_len = int(data_len.decode())
    # client_socket.send('200 ok'.encode())
    receive_data = b''
    receive_len = 0
    #方法一
    while receive_len < receive_size_len:
    #这里加if判断语句的话,在客户端可以取消注释的一行:client_socket.send('200 ok'.encode())
    if receive_size_len - receive_len > 1024:
    size = 1024
    else:
    size = receive_size_len - receive_len

    data = client_socket.recv(size)
    receive_len += len(data.decode())
    receive_data += data
    print('33[1;35;01m输出数据为: 33[0m',receive_data.decode())

    else:
    print("33[1;36;01mcmd res receive done...33[0m")
    break
    client_socket.close()
    print('33[1;33;0mclient has over 33[0m'
  • 相关阅读:
    webpack中设置jquery为全局对象
    JS判断不同web访问环境,主要针对移动设备,
    js比较两个日期天数差
    原生js跨域
    我们项目中用到的jsonp跨域
    Js跨域解决方法总结
    js call的使用,js call 方法实现继承
    windows下配置bower路径
    兼容弹层代码
    自定义下拉列表框(2015.1.30)
  • 原文地址:https://www.cnblogs.com/z977690557/p/11215069.html
Copyright © 2011-2022 走看看