写博客最怕写什么? 系统原理,框架内核...

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
sk = socket.socket() ## 创建一个sk对象/实例
sk.bind(("127.0.0.1",9999,)) ##ip+端口是一个元祖
##后面最后排5个
sk.listen(5)
# 接收客户端的请求 ,这会阻塞,就是一直等待,程序会停在这里
# 一旦有请求过来,会接受
while True:
## 基于conn连接发送消息
conn,address = sk.accept()
print(address,conn)

socket 服务端初始版

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
obj = socket.socket()
obj.connect(("127.0.0.1",9999,))
obj.close()

socket 客户端初始版

上面的代码是最最最原始的socket通信代码,下面给出一个进一步的代码;

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket ##导入socket模块
sk = socket.socket() ## 创建一个sk对象/实例,即实例化socket对象
sk.bind(("127.0.0.1",9999,)) ##ip+端口是一个元祖,定义好监听的IP地址和端口,可以绑定网卡上的IP地址,但是生产环境中一般绑定0.0.0.0这样所有网卡上都能够接收并处理这个端口的数据了 sk.listen(5) ##设定侦听开始并设定侦听队列里面等待的连接数最大为5 while True: # 接收客户端的请求 ,程序会阻塞在这里,就是一直等待,程序会停在这里;一旦有请求过来,会接受.好比老鸨在门口迎客(连接请求)...
print("服务器处于准备接受状态中...")
## 可以基于conn 发信息
conn,address = sk.accept() ##conn拿到的是接入的客户端的对象,之后服务端和客户端通信都是基于这个conn对象进行通信,address获取的是连接的客户端的IP和端口.
## conn好比一个小姐,从老鸨那里接手客人,老鸨腾空出来,迎接下一个连接请求...
conn.sendall(bytes("xx来电....", encoding='utf8'))
while True: #这个循环来实现相互之间通信的循环
try: ## 为什么要使用try包裹这一块呢?因为在通信过程中客户端突然退出了的话,服务端阻塞在recv状态时将会抛出异常并终止程序,
# 为了解决这个异常,需要我们自己捕获这个异常,这是在windows上,linux上不会抛出异常(测试依旧会...).
receiveBytes = conn.recv(1024) # 定义接收的数据大小为1024个字节并接受客户端传递过来的数据,注意这里的数据在python3中是bytes类型的,
# 在python3中网络通信发送和接收的数据必须是bytes类型的,否则会报错
receiveStr = str(receiveBytes,encoding='utf8') ##打印客户端传递过来的数据,需要从bytes类型数据解码成unicode类型的数据
if receiveStr == 'q': ##如果客户端传递过来的是q,就break当前循环,中断通信连接,跳到上层循环,继续等待下位客人
print("当前会话结束,感谢使用!")
break
conn.sendall(bytes(receiveStr+"好",encoding="utf8"))
except ConnectionResetError as e: ## 捕获到异常之后,打印异常出来并退出循环等待下一个客户端连接
print(e)
continue
##返回接受到的信息
# print(str(receiveBytes))
#py35中不能发字符串,而是发字节
#
print(address,conn)

socket 服务端代码

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
obj = socket.socket()
obj.connect(("127.0.0.1",9999,))
## obj.recv 也是阻塞的
# print("waitint....")
receiveBytes = obj.recv(1024) ##超过1024,就下次在接收
# print("together...")
receiveStr = str(receiveBytes,encoding='utf8')
print(receiveStr)
while True: # 死循环实现通信
inp = input("请输入内容:")
if inp == 'q':
obj.sendall(bytes(inp, encoding='utf8'))
break
else:
obj.sendall(bytes(inp,encoding='utf8'))
receiveBytes = obj.recv(1024)
result = str(receiveBytes,encoding='utf8')
print(result)
obj.close()

socket 客户端代码

上面给出的代码依旧是服务端和客户端一对一.即服务端在同一时间内,只能和一个客户端通信.这有毛病..

下面的代码,是使用python的socketserver模块,利用多线程,实现同一个服务端"同时"和多喝客户端通信.

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
import socketserver
class MyServer(socketserver.BaseRequestHandler):
def handle(self):
#print(self.request, self.client_address, self.server)
conn = self.request
conn.sendall(bytes("服务端正在处理你的请求...", encoding='utf8'))
while True:
recvB = conn.recv(1024)
resvS = str(recvB, encoding='utf8')
if resvS == "q":
print("当前会话结束,感谢使用!")
break
conn.sendall(bytes(resvS + "好", encoding='utf8'))
if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1',9999,),MyServer)
server.serve_forever()

socketserver 服务端

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
ck = socket.socket()
ck.connect(("127.0.0.1",9999,))
recvB = ck.recv(1024)
print(str(recvB,encoding='utf8'))
while True:
inp = input("请输入聊天内容:")
if inp =="q":
ck.sendall(bytes(inp,encoding='utf8'))
break
else:
ck.sendall(bytes(inp, encoding='utf8'))
recvB1 = ck.recv(1024)
print(str(recvB1,encoding='utf8'))
ck.close()

socket 客户端

socket模块博客到此结束....

python 网络编程 代码版的更多相关文章

  1. python 网络编程第二版

    为服务端增加多进程解决方案 1.server端代码如下: #!/usr/bin/python #!coding:utf-8 import os,sys,time from socket import ...

  2. Python网络编程基础 PDF 完整超清版|网盘链接内附提取码下载|

    点此获取下载地址提取码:y9u5 Python网络编程最好新手入门书籍!175个详细案例,事实胜于雄辩,Sockets.DNS.Web Service.FTP.Email.SMTP.POP.IMAP. ...

  3. python核心编程第二版笔记

    python核心编程第二版笔记由网友提供:open168 python核心编程--笔记(很详细,建议收藏) 解释器options:1.1 –d   提供调试输出1.2 –O   生成优化的字节码(生成 ...

  4. 28、Python网络编程

    一.基于TCP协议的socket套接字编程 1.套接字工作流程 先从服务器端说起.服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客 ...

  5. Python核心编程(第二版)PDF

    Python核心编程(第二版) 目录 第1部分 Python核心第1章 欢迎来到Python世界1.1 什么是Python1.2 起源1.3 特点1.3.1 高级1.3.2 面向对象1.3.3 可升级 ...

  6. 拒绝从入门到放弃_《Python 核心编程 (第二版)》必读目录

    目录 目录 关于这本书 必看知识点 最后 关于这本书 <Python 核心编程 (第二版)>是一本 Python 编程的入门书,分为 Python 核心(其实并不核心,应该叫基础) 和 高 ...

  7. 图解Python网络编程

    返回目录 本篇索引 (1)基本原理 (2)socket模块 (3)select模块 (4)asyncore模块 (5)asynchat模块 (6)socketserver模块 (1)基本原理 本篇指的 ...

  8. Python学习(22)python网络编程

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

  9. Day07 - Python 网络编程 Socket

    1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...

随机推荐

  1. 一致性Hash算法(转)

    一致性Hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1.平衡性(Balance):平衡性是指哈希的结果能够尽可能分布在所有的缓冲(Cache)中去,这样可以使得所有的缓 ...

  2. 大div中,三个小div水平居中

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 去掉img与img之间,video与video之间默认的间距(3种方式)

    img,video{ /*第1种方式*/ border:; vertical-align: bottom; /*第2种方式*/ outline-width:0px; vertical-align:to ...

  4. Maven快速安装配置

    环境:windows7_x86  maven3.3.3   maven是管理项目的常用工具,不用安装,直接配置即可.在配置maven前,需要先安装JDK.   1,安装JDK(注意此版本的Maven要 ...

  5. Paper Reading_ML for system

    最近(以及预感接下来的一年)会读很多很多的paper......不如开个帖子记录一下读paper心得 SysML相关的文章很多来源于上学期的8980课.有些和具体field(比如DB/architec ...

  6. 计算机系统结构总结_Memory Review

    这次就边学边总结吧,不等到最后啦 Textbook: <计算机组成与设计——硬件/软件接口>  HI <计算机体系结构——量化研究方法>       QR Ch3. Memor ...

  7. ELK + filebeat集群部署

    ELK + filebeat集群部署 一.ELK简介 1. Elasticsearch Elasticsearch是一个实时的分布式搜索分析引擎, 它能让你以一个之前从未有过的速度和规模,去探索你的数 ...

  8. ASSERT()断言

    头文件<assert.h>   作用:用于判断是否有非法的数据,有则程序报告错误,终止运行.(注意是非法情况,而不是错误情况)   ASSERT()和assert()的区别: ASSERT ...

  9. make_smbcodepage - 为Samba创建代码页文件

    总览 make_smbcodepage c|d 代码页 输入文件 输出文件 描述 这个工具是是Samba组件的一部分. 针对Samba 2.2的国际化功能,使用make_smbcodepage可以编译 ...

  10. babel 转换箭头函数

    转换前: const sum = (a,b)=>a+b 转化后: // "use strict"; // var fn = function fn(a, b) { // re ...