Python socket套接字通信
一、什么是socket?
socket是一个模块, 又称套接字,用来封装 互联网协议(应用层以下的层)。
二、为什么要有socket?
socket可以实现互联网协议 应用层以下的层 的工作,提高开发效率。
三、怎么使用socket?
import socket
写socket套接字:
- Client
- Server
使用如下:client.py
'''
启动服务端后再启动客户端
'''
import socket
#1.买手机
client = socket.socket() #拿到一个手机对象
#2.拨号
client.connect(('127.0.0.1',9527)) #客户端的ip和port必须与服务器一致
print('client is running')
#3.通信循环
#讲话给对方听
while True:
send_data = input('客户端>>>:')
client.send(send_data.encode('utf-8')) #只能发bytes类型
data = client.recv(1024)
if data.decode('utf-8') == 'q':
break
if len(data) == 0:
break
print(data.decode('utf-8'))
#4.断开连接
client.close()
server.py
'''
先启动套接字服务端
注意:
客户端发送一次消息,服务端就得接受一次,再发送消息。
'''
import socket
#1.买手机
server = socket.socket() #拿到一个手机对象
# print(server) # server是用来收发链接请求,建立链接
#2.绑手机卡
server.bind(('127.0.0.1',9527)) #0-65535 #本地回环地址 ---》'127.0.0.1'
#3.开机(半连接池)
server.listen(5) #同一时刻,最大请求数为5个 实际==6
print('sever is running')
#4.等待电话请求
#conn:指的是服务端往客户端的管道
#conn,addr = server.accept() #(双向连接的套接字对象,存放客户端IP和端口的小元组)
# print(conn) #conn代表双向链接,用来收发链接
#5.循环实现可接受多个用户访问
while True:
#等待电话接入 --->接入客户端
# conn: 指的是服务端往客户端的管道
conn,addr = server.accpt()
print(addr)
#实现循环通信
while True:
try: #监听代码块是否有异常出现
# 接受对方讲话的内容
# data --->客户端发送过来的消息
data = conn.recv(1024) #1024接受的最大字节数bytes
if len(data) == 0:
break
if data.decode('utf-8') == 'q':
break
print(data.decode('utf-8'))
send_data = input('服务器>>>:')
#服务器往客户端发送消息
conn.send(send_data.encode('utf-8'))
# 捕获异常信息,并打印 # e: 报错信息
except Exception as e:
print(e)
break
#6.挂电话连接
conn.close()
四、并发实现套接字通信
版本一:简单版
client.py
import socket
client = socket.socket()
client.connect(('127.0.0.1',9500))
print('Client is running')
while True:
msg = input('客户端:').encode('utf-8')
client.send(msg)
data = client.recv(1024)
print(data)
server.py
import socket
from threading import Thread
#封装成函数
def communicate(conn):
while True: #通信循环
try:
data = conn.recv(1024)
if len(data) == 0:
break
print(data.decode('utf-8'))
conn.send('好啊'.encode('utf-8'))
except Exception as e:
print(e)
break
conn.close()
def server(backlog=5):
server = socket.socket()
server.bind(('127.0.0.1',9500))
server.listen(backlog)
while True: #链接循环
conn,addr = server.accept()
print(addr)
t = Thread(target=communicate,args=(conn,))
t.start()
if __name__ == '__main__':
t = Thread(target=server)
t.start()
版本二:半连接池版
client.py
import socket
client = socket.socket()
client.connect(('127.0.0.1',9500))
print('Client is running')
while True:
msg = input('客户端:').encode('utf-8')
client.send(msg)
data = client.recv(1024)
print(data)
server.py
import socket
from concurrent.futures import ThreadPoolExecutor
server = socket.socket()
server.bind(('127.0.0.1',9500))
server.listen(5)
#封装成一个函数
def run(conn):
while True:
try:
data = conn.recv(1024)
if len(data) == 0:
break
print(data.decode('utf-8'))
conn.send('好啊'.encode('utf-8'))
except Exception as e:
print(e)
break
conn.close()
if __name__ == '__main__':
print('Server is running')
pool = ThreadPoolExecutor(100)
while True:
conn,addr = server.accept()
pool.submit(run,conn)
Python socket套接字通信的更多相关文章
- 网络编程 TCP协议:三次握手,四次回收,反馈机制 socket套接字通信 粘包问题与解决方法
TCP协议:传输协议,基于端口工作 三次握手,四次挥手 TCP协议建立双向通道. 三次握手, 建连接: 1:客户端向服务端发送建立连接的请求 2:服务端返回收到请求的信息给客户端,并且发送往客户端建立 ...
- Python Socket套接字编程
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- python网络编程-socket套接字通信循环-粘包问题-struct模块-02
前置知识 不同计算机程序之间数据的传输 应用程序中的数据都是从程序所在计算机内存中读取的. 内存中的数据是从硬盘读取或者网络传输过来的 不同计算机程序数据传输需要经过七层协议物理连接介质才能到达目标程 ...
- Python Socket套接字
socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Un ...
- python socket 套接字编程 单进程服务器 实现多客户端访问
服务器: import socket #单进程服务器 实现多客户端访问 IO复用 #吧所有的客户端套接字 放在一个列表里面,一次又一次的便利过滤 server = socket.socket(sock ...
- python UDP套接字通信
UDPserver.py import socket #导入套接字模块 s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # - socket.A ...
- Python socket套接字简单例子
- 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法
网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...
- Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令.
Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令. 一丶socket套接字 什么是socket套接字: 专业理解: socket是应用层与TCP/IP ...
随机推荐
- 直击 KubeCon 现场 | 阿里云 Hands-on Workshop 亮点回顾
相关文章链接[合集]规模化落地云原生,阿里云亮相 KubeCon China沉淀九年,一文看清阿里云原生大事件 2019 年 6 月 24 日至 26 日,KubeCon + CloudNativeC ...
- 1176. Two Ends
题目链接地址:http://soj.me/1176 题目大意:两头取数.第一个人随机取,第二个人用贪婪算法(每次都取大的),求两人取数在第一个人赢的情况下的最大分差.使用贪婪算法时,如果左右两边相等, ...
- 给博客添加rss订阅
如果是自己搭建博客,有一个问题是如何写一篇新的文章就可以告诉读者,你写了一篇新的?一个简单方法是使用 rss ,RSS订阅是站点用来和其他站点之间共享内容的一种简易方式,即Really Simple ...
- @noi - 172@ 追捕大象
目录 @description@ @solution@ @accepted code@ @details@ @description@ 在一块平原上有一头大象. 平原被分成 n×m 个格子.初始时大象 ...
- javascript 容易混淆遗忘的基础知识
1. 标识符 所谓标识符,就是指变量.函数.属性的名字,或者函数的参数.标识符可以是按照下列格式规则组合起来的一或多个字符: 1.1 第一个字符必须是一个字母.下划线( _ )或 ...
- 微信小程序弹框wx.showModal如何修改样式
由于官方API提供的显示模态弹窗,只能简单地显示文字内容,不能对对话框内容进行自定义,欠缺灵活性,所以自己从模态弹窗的原理角度来实现了自定义的模态对话框. wx.showModal修改样式后的效果,如 ...
- redux【react】
首先介绍一下redux就是Flux的一种进阶实现.它是一个应用数据流框架,主要作用应用状态的管理 一.设计思想: (1).web应用就是一个状态机,视图和状态一一对应 (2).所有的状态保存在一个对象 ...
- C#循环语句练习(二)
1.求1!+2!+...+n! 所有阶乘的和 2.求100以内的质数 (1)第一种做法 (2)另一种做法 3. 总数=幼兔+小兔+成兔成兔=上个月的小兔+上个月的成兔小兔=上个月的幼兔幼兔=这个月的成 ...
- 高级教程: 作出动态决策和 Bi-LSTM CRF 重点
动态 VS 静态深度学习工具集 Pytorch 是一个 动态 神经网络工具包. 另一个动态工具包的例子是 Dynet (我之所以提这个是因为使用 Pytorch 和 Dynet 是十分类似的. 如果你 ...
- 2019-4-10-win10-uwp-自定义标记扩展
title author date CreateTime categories win10 uwp 自定义标记扩展 lindexi 2019-04-10 09:46:13 +0800 2019-04- ...