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('\033[1;34;0m地址是\033[0m',addr)
data = recip.recv(1024)
if not data:
print('\033[1;38;0m客户端 has lost...\033[0m')
break
msg_res = os.popen(data.decode('utf-8')).read()
print('\033[1;32;0m发送到客户端的内容为:\n\033[0m',msg_res)
recip.send(str(len(msg_res)).encode())
recip.send(msg_res.encode())
print('\033[1;33;0m发送到客户端的内容为:\n\033[0m', msg_res.encode())
print('\033[1;35;0m发送数据的长度:\033[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('\033[1;35;01m输出数据为:\n\033[0m',receive_data.decode()) else:
print("\033[1;36;01mcmd res receive done...\033[0m")
break
client_socket.close()
print('\033[1;33;0mclient has over \033[0m'
python socket使用的更多相关文章
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- python socket发送魔法包网络唤醒开机.py
python socket发送魔法包网络唤醒开机.py 现在的电脑应该都普遍支持有线网络的WOL了,支持无线网络唤醒的电脑,可能比较少. """ python socke ...
- Python socket编程之二:【struct.pack】&【struct.unpack】
import struct """通过 socket 的 send 和 recv 只能传输 str 格式的数据""" "" ...
- Python Socket,How to Create Socket Server? - 网络编程实例
文章出自:Python socket – network programming tutorial by Silver Moon 原创译文,如有版权问题请联系删除. Network programin ...
- Python Socket,How to Create Socket Cilent? - 网络编程实例
文章出自:Python socket – network programming tutorial by Silver Moon 原创译文,如有版权问题请联系删除. Network programin ...
- Python Socket通信原理
[Python之旅]第五篇(一):Python Socket通信原理 python Socket 通信理论 socket例子 摘要: 只要和网络服务涉及的,就离不开Socket以及Socket编 ...
- Python Socket单线程+阻塞模式
Python之旅]第五篇(二):Python Socket单线程+阻塞模式 python Socket单线程 Socket阻塞模式 串行发送 摘要: 前面第五篇(一)中的一个Socket例子其实就是 ...
- python socket之tcp服务器与客户端demo
python socket之tcp服务器与客户端demo 作者:vpoet mails:vpoet_sir@163.com server: # -*- coding: cp936 -*- ''' 建立 ...
- python socket编程---从使用Python开发一个Socket示例说到开发者的思维和习惯问题
今天主要说的是一个开发者的思维和习惯问题. 思维包括编程的思维和解决一个具体问题的分析思维,分析思路,分析方法,甚至是分析工具. 无论是好习惯还是不好的习惯,都是在者一天一天的思维中形成的.那些不好的 ...
随机推荐
- Hidden的应用
在写jsp中如果一个 请求的参数(例如:paramTypeCode)不能在另一个请求中使用,我们为了能让他在请求中使用可以利用隐藏域来表示,下面介绍他的用法: 1 <input type= ...
- shell高级-----正则表达式
正则表达式概述 正则表达式是一种定义的规则,Linux工具可以用它来过滤文本. 基础正则表达式 纯文本 [root@node1 ~]# echo "this is a cat" | ...
- Slider 滑块
通过拖动滑块在一个固定区间内进行选择 ¶基础用法 在拖动滑块时,显示当前值 通过设置绑定值自定义滑块的初始值 <template> <div class="block&qu ...
- 常用 tcpdump 抓包方式
目录 文章目录 目录 tcpdump 指令 关键字 常用指令选项 常规操作示例 过滤主机 过滤端口 过滤网络(网段) 过滤协议 复杂的逻辑表达式过滤条件 参考资料 tcpdump 指令 tcpdump ...
- 工具栏对象GUI Status 与GUI Title
GUI Status 与GUI Title用于自定义工具栏按钮及Report程序标题栏显示内容, 可以通过se41\SE80或直接SE38中展开对象列表进行相关操作. 如下是在SE38里,点击[显示物 ...
- JS对象—数组总结(创建、属性、方法)
JS对象—数组总结(创建.属性.方法) 1.创建字符串 1.1 new Array() var arr1 = new Array(); var arr2 = new Array(6); 数组的长度为6 ...
- Shell编程、part4
本节内容 1. shell函数 2. shell正则表达式 shell函数 shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数.给这段代码起个名字称为函数名,后续可以直 ...
- 配置本地访问远程Linux系统服务器的jupyter notebook
环境情况 远程服务器上配置了anaconda 本地主机没有安装anaconda(其实安不安装都无所谓,有浏览器就行) 配置步骤如下 登录远程服务器 生成配置文件 jupyter notebook -- ...
- Linux系统搭建并管理Git服务器
搭建Git服务器 GitHub就是一个免费托管开源代码的远程仓库.但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓 ...
- mybatis字段映射枚举类型
在底层使用mybatis的时候,我们可能会需要把表里的字段映射到Java里面的枚举类,现总结下工作中的用法: sku表里一个status_type字段为int类型.(这里是postgresql的脚本) ...