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

 #!/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. php配置伪静态如何将.htaccess文件转换 nginx伪静态文件

    php通常设置伪静态三种情况,.htaccess文件,nginx伪静态文件,Web.Config文件得形式,如何将三种伪静态应用到项目中呢, 1,.htaccess文件 实例 <IfModule ...

  2. JS的for循环包裹异步函数的问题

    有个循环,循环一个异步回调,为啥回调引用的循环值都是最后一步循环的循环值?然后,又有些时候无论什么循环值都得不到? var arr = [1,3,5,7,9]; var arrLength = arr ...

  3. Django模板层2

    一.单表操作 1.1 开启test from django.test import TestCase import os # Create your tests here. if __name__ = ...

  4. Consul学习研究

    参考资料 Consul 集群部署

  5. 4.Pod控制器

    Controller-manager: Kube-controller-manager Cloud-controller-manager:在K8S上启用CloudProvider的时候才需要,用来配合 ...

  6. XNUCA 2019ezPHP

    ezPHP 源码很简单(感觉越简单的源码越不好搞),一个写文件的功能且只能写文件名为[a-z.]* 的文件,且文件内容存在黑名单过滤,并且结尾被加上了一行,这就导致我们无法直接写入.htaccess里 ...

  7. Python---Tkinter---计算器

    Python---Tkinter---计算器 - 模拟系统的计算器功能 - 实现一个简单的具有加减法等操作的计算器 - 使用tkinter - 操作步骤 - 画GUI - 给每个控件配置相应的事件 - ...

  8. 【leetcode】1128. Number of Equivalent Domino Pairs

    题目如下: Given a list of dominoes, dominoes[i] = [a, b] is equivalent to dominoes[j] = [c, d] if and on ...

  9. echart-折线图,数据太多想变成鼠标拖动和滚动的效果?以及数据的默认圈圈如何自定义圆圈的样式

    1.数据太多怎么办???想拖拽,想滑动 dataZoom: [ { type: 'slider', } ] dataZoom: [ { type: 'inside',  }] 两种功能都需要,还想调样 ...

  10. Jquery TextBox进入focus的时候 改变background-color

    <!DOCTYPE html><html><head><script src="/jquery/jquery-1.11.1.min.js" ...