简单的socket通信

  1. import socket
  2. client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  3. client.connect(('127.0.0.1', 8080))
  4. msg = input('>>>').strip()
  5. client.send(msg.encode('gbk'))
  6. res = client.recv(1024)
  7. print(res)
  8. client.close()

客户端

  1. import socket
  2. sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  3. sk.bind(('127.0.0.1', 8080))
  4. sk.listen(5)
  5. conn, addr = sk.accept()
  6. res = conn.recv(1024)
  7. conn.send(res.upper())
  8. conn.close()
  9. sk.close()

服务端

聊天版socket通信

  1. import socket
  2. client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  3. client.connect(('127.0.0.1', 8080))
  4. while True:
  5. msg = input('发送信息>>>').strip()
  6. client.send(msg.encode('gbk'))
  7. re = client.recv(1024)
  8. print('接收到的消息%s'%(re.decode('gbk')))

聊天版客户端

  1. import socket
  2. server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  3. server.bind(('127.0.0.1', 8080))
  4. server.listen(5)
  5. while True:
  6. conn,addr = server.accept()
  7. while True:
  8. try:
  9. msg = conn.recv(1024)
  10. print('接收到客户端的信息%s'%(msg.decode('gbk')))
  11. re = input('请回复信息>>>').strip()
  12. conn.send(re.encode('gbk'))
  13. except ConnectionResetError:
  14. pass

聊天版服务端

粘包版socket通信

  1. import socket
  2. import struct
  3. import pickle
  4. client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  5. client.connect(('127.0.0.1', 8080))
  6. while True:
  7. msg = input('请输入发送的消息>>>').strip()
  8. msg_dict = {
  9. 'msg':msg
  10. }
  11. msg_p = pickle.dumps(msg_dict)
  12. client.send(struct.pack('i',len(msg_p)))
  13. res = pickle.loads(client.recv(1024))
  14. if res['confirm']:
  15. client.send(msg.encode('gbk'))
  16. else:
  17. pass

粘包版客户端

  1. import socket
  2. import struct
  3. import pickle
  4. server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  5. server.bind(('127.0.0.1', 8080))
  6. server.listen(5)
  7. while True:
  8. conn, addr = server.accept()
  9. while True:
  10. res = conn.recv(4)
  11. receive_bytes = struct.unpack('i',res)[0]
  12. if receive_bytes<1024:
  13. msg = {
  14. 'confirm': True,
  15. }
  16. msg_p = pickle.dumps(msg)
  17. conn.send(msg_p)
  18. res = conn.recv(1024)
  19. print(res.decode('gbk'))
  20. else:
  21. msg = {
  22. 'confirm':False,
  23. }
  24. msg_p = pickle.dumps(msg)
  25. conn.send(msg_p)

粘包版服务端

写一个异常

  1. try:
  2. int_number = int(input('请输入一个整数').strip())
  3. print(int_number)
  4. except Exception as e:
  5. print(e)

写一个异常

自定义异常

  1. class E(BaseException):
  2. def __init__(self):
  3. err = '发生异常了!'
  4. BaseException.__init__(self,err)
  5. raise E

自定义异常

windows系统版客户端和服务端

  1. import socket
  2. import pickle
  3. import struct
  4. import subprocess
  5. client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  6. client.connect(('127.0.0.1', 8080))
  7. while True:
  8. command = input('请输入命令>>>').strip()
  9. msg_dict = {
  10. 'msg':command
  11. }
  12. msg = pickle.dumps(msg_dict)
  13. client.send(struct.pack('i', len(msg)))
  14. res = client.recv(1024)
  15. if pickle.loads(res)['confirm']:
  16. client.send(command.encode('gbk'))
  17. # 解析长度
  18. res_len = client.recv(4)
  19. cmd_len = struct.unpack('i',res_len)[0]
  20. # 接收结果
  21. fin_res = client.recv(cmd_len).decode('gbk')
  22. print(fin_res)
  23. else:
  24. print('超出字符限制,请重试!')

(系统命令版)客户端

  1. import socket
  2. import pickle
  3. import struct
  4. import subprocess
  5. # a=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)
  6. # print(a.stdout.read().decode('gbk'))
  7. server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  8. server.bind(('127.0.0.1', 8080))
  9. server.listen(5)
  10. while True:
  11. conn, addr = server.accept()
  12. while True:
  13. try:
  14. res = conn.recv(4)
  15. res_bytes = struct.unpack('i',res)[0]
  16. if res_bytes<1024:
  17. msg = {
  18. 'confirm':True,
  19. }
  20. conn.send(pickle.dumps(msg))
  21. cmd = conn.recv(1024).decode('gbk')
  22. cmd_res = subprocess.Popen(
  23. cmd,
  24. shell= True,
  25. stdout= subprocess.PIPE,
  26. stderr= subprocess.PIPE
  27. )
  28. res_cmd = cmd_res.stdout.read()
  29. # 发送长度
  30. conn.send(struct.pack('i',len(res_cmd)))
  31. # 发送结果
  32. conn.send(res_cmd)
  33. else:
  34. msg = {
  35. 'confirm': False,
  36. }
  37. conn.send(pickle.dumps(msg))
  38.  
  39. except Exception as e:
  40. print(e)
  41. break

(系统命令版)服务端

路飞学城Python-Day27(复习)的更多相关文章

  1. 路飞学城—Python爬虫实战密训班 第三章

    路飞学城—Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫: - 定义调度器 - ...

  2. 路飞学城—Python爬虫实战密训班 第二章

    路飞学城—Python爬虫实战密训班 第二章 一.Selenium基础 Selenium是一个第三方模块,可以完全模拟用户在浏览器上操作(相当于在浏览器上点点点). 1.安装 - pip instal ...

  3. 路飞学城Python爬虫课第一章笔记

    前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 之前看阮一峰的博客文章,介绍到路飞学城爬虫课程限免,看了眼内容还不错,就兴冲冲报了名,99块钱满足以下条件会返还并送书送视频. 缴 ...

  4. 路飞学城-Python开发集训-第3章

    学习心得: 通过这一章的作业,使我对正则表达式的使用直接提升了一个level,虽然作业完成的不怎么样,重复代码有点多,但是收获还是非常大的,有点找到写代码的感觉了,遗憾的是,这次作业交过,这次集训就结 ...

  5. 路飞学城-Python开发集训-第1章

    学习体会: 在参加这次集训之前我自己学过一段时间的Python,看过老男孩的免费视频,自我感觉还行,老师写的代码基本上都能看懂,但是实际呢?....今天是集训第一次交作业的时间,突然发现看似简单升级需 ...

  6. 路飞学城-Python开发集训-第4章

    学习心得: 学习笔记: 在python中一个py文件就是一个模块 模块好处: 1.提高可维护性 2.可重用 3.避免函数名和变量名冲突 模块分为三种: 1.内置标准模块(标准库),查看所有自带和第三方 ...

  7. 路飞学城-Python开发集训-第2章

    学习心得: 这章对编码的讲解超级赞,现在对于编码终于有一点认知了,但还没有大彻大悟,还需要更加细心的琢磨一下Alex博客和视频,以前真的是被编码折磨死了,因为编码的问题而浪费的时间很多很多,现在终于感 ...

  8. 路飞学城-Python开发-第二章

    ''' 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家' ...

  9. 路飞学城-Python开发-第三章

    # 数据结构: # goods = [ # {"name": "电脑", "price": 1999}, # {"name&quo ...

  10. 路飞学城-Python开发-第一章

    # 基础需求: # 让用户输入用户名密码 # 认证成功后显示欢迎信息 # 输错三次后退出程序 username = 'pandaboy' password = ' def Login(username ...

随机推荐

  1. Redis详解入门篇(转载)

    Redis详解入门篇(转载) [本教程目录] 1.redis是什么2.redis的作者3.谁在使用redis4.学会安装redis5.学会启动redis6.使用redis客户端7.redis数据结构 ...

  2. java 常用API 包装 练习

    package com.oracel.demo01; import java.util.Random; public class Swzy { public static void main(Stri ...

  3. 有关详细信息, 请使用 -Xlint:unchecked 重新编译。

    这是在复制代码的时候,没有修改路径,但是IDEA没有报错,还会爆出 WARN ework.web.servlet.PageNotFound - No mapping found for HTTP re ...

  4. centos7编译安装mysql5.6

    先安装如下依赖包: $ yum -y install make gcc-c++ cmake bison-devel  ncurses-devel 下载MySQL5.6.14安装包,https://pa ...

  5. Django的时间字段DateTimeField

    一. Django的时间字段DateTimeField 创建django的model时,有DateTimeField.DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着 ...

  6. ssh远程连接和linux基本操作

    客户端工具:Xshell,SecureCRT 启动网卡(eth0): ifup eth0 查看IP地址: ifconfig       [root@oldboy~] : [登入名 @ 主机名 文件或者 ...

  7. css文本两端对齐

    在做表单时我们经常遇到让上下两个字段对齐的情况,比如姓名, 手机号码, 出生地.这样我们就要用到 text-align, text-justify样式了. text-align直接设为justify就 ...

  8. 洛谷 1144 最短路计数 bfs

    洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移, ...

  9. Linux C++服务器端进程SDK

    目标:开发人员在这个SDK的基础上开发,不用关注技术细节,只需要开发对应业务消息处理函数即可 1.每个进程SDK包括一个系统服务和多个业务服务,对外发布服务ID,每个服务有一个请求队列和一个反馈队列, ...

  10. Java&amp;Xml教程(十一)JAXB实现XML与Java对象转换

    JAXB是Java Architecture for XML Binding的缩写,用于在Java类与XML之间建立映射,可以帮助开发人员非常方便的將XML和Java对象进行相互转换. 本文以一个简单 ...