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

 #!/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. HNUSTOJ-1636 心电图

    1636: 心电图 时间限制: 1 Sec  内存限制: 128 MB提交: 583  解决: 231[提交][状态][讨论版] 题目描述 众所周知,ACM/ICPC实验室聚集了一堆学霸Orz 有学霸 ...

  2. Redis---使用场景

    3.使用场景 计数器   可以对String进行自增自减运算,从而实现计算器功能.   Redis这种内存型数据库的读写性能非常高,很适合存储频繁读写的及数量 缓存   将热点数据放到内存中,设置内存 ...

  3. 在SQL中存储过程的一般语法

    一般分为十种情况,每种语法各不相同: 1. 创建语法 1 2 3 4 5 6 7 create proc | procedure pro_name    [{@参数数据类型} [=默认值] [outp ...

  4. git基本命令和仓库操作

    首先git是什么?git是github上的一个代码托管工具,是一款代码版本管理工具,github上的代码是基于git来进行托管的.github是全球的开源社区.Git 保存的不是文件的变化或者差异,而 ...

  5. ELK-全文检索技术-elasticsearch集群及sde_restful

    1       搭建ES集群 集群的说明 我们计划集群名称为:leyou-elastic,部署3个elasticsearch节点,分别是: node-01:http端口9201,TCP端口9301 n ...

  6. 【学习总结】快速上手Linux玩转典型应用-目录

    内容链接 慕课网:快速上手Linux玩转典型应用 目录 第1章-课程介绍 第2章-linux简介 第3章-CentOS的安装 第4章-准备工作 第5章-远程连接SSH专题 第6章-linux常用命令讲 ...

  7. 利用WebSocket和EventSource实现服务端推送

    可能有很多的同学有用 setInterval 控制 ajax 不断向服务端请求最新数据的经历(轮询)看下面的代码: setInterval(function() { $.get('/get/data- ...

  8. KFK2060穿越者

  9. Qt项目中main主函数及其作用

    http://c.biancheng.net/view/1821.html main.cpp 是实现 main() 函数的文件,下面是 main.cpp 文件的内容. #include "w ...

  10. VS 2012 Unit Test

    1,Open Tool->Custmoize 2,Create Unit Tests Move Down Run Test 3,Restart run VS 4,Create UnitTest ...