一、什么是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套接字通信的更多相关文章

  1. 网络编程 TCP协议:三次握手,四次回收,反馈机制 socket套接字通信 粘包问题与解决方法

    TCP协议:传输协议,基于端口工作 三次握手,四次挥手 TCP协议建立双向通道. 三次握手, 建连接: 1:客户端向服务端发送建立连接的请求 2:服务端返回收到请求的信息给客户端,并且发送往客户端建立 ...

  2. Python Socket套接字编程

    Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...

  3. python网络编程-socket套接字通信循环-粘包问题-struct模块-02

    前置知识 不同计算机程序之间数据的传输 应用程序中的数据都是从程序所在计算机内存中读取的. 内存中的数据是从硬盘读取或者网络传输过来的 不同计算机程序数据传输需要经过七层协议物理连接介质才能到达目标程 ...

  4. Python Socket套接字

    socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Un ...

  5. python socket 套接字编程 单进程服务器 实现多客户端访问

    服务器: import socket #单进程服务器 实现多客户端访问 IO复用 #吧所有的客户端套接字 放在一个列表里面,一次又一次的便利过滤 server = socket.socket(sock ...

  6. python UDP套接字通信

    UDPserver.py import socket #导入套接字模块 s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # - socket.A ...

  7. Python socket套接字简单例子

  8. 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法

    网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) ​ 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...

  9. Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令.

    Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令. 一丶socket套接字 什么是socket套接字: ​ ​  ​ 专业理解: socket是应用层与TCP/IP ...

随机推荐

  1. Linux Shell 教程

    Shell 教程 Shell 是一个C语言编写的程序,他是用户使用Linux的桥梁,Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面用户通 ...

  2. JQuery------库

    JQuery-------------模块.类库 集成了DOM/BOM/JS的类库 一.查找元素 DOM 10左右 JQuery: 选择器: 筛选: ps:版本: 1.x:兼容性最好.1.12推荐 2 ...

  3. saltStack_安装和使用

    服务端: yum install -y salt-master 客服端: yum install -y salt-minion 服务端启动: systemctl restartsalt-master ...

  4. 2019南昌网络赛-I. Yukino With Subinterval 线段树套树状数组,CDQ分治

    TMD...这题卡内存卡的真优秀... 所以以后还是别用主席树的写法...不然怎么死的都不知道... 树套树中,主席树方法开权值线段树...会造成空间的浪费...这道题内存卡的很紧... 由于树套树已 ...

  5. 基于LIVE555的RTSP QoS实现

    如何从OnDemandServerMediaSubsession类以及继承类对象中获取RTCP信息(句柄) OnDemandServerMediaSubsession.cpp void StreamS ...

  6. Install Openjdk11 to Ubuntu 18.04 LTS

      Ubuntu 18.04 LTS系统上通过sudo apt install openjdk-11-*命令安装的jdk11版本依然是jdk10,怎么样才能安装openjdk 11呢,今天,我们就来完 ...

  7. jq实现简单购物车增删功能

    https://www.cnblogs.com/sandraryan/ jq实现购物车功能 点击+- 增减数量,计算价格: 点击删除,删除当前行(商品) 点击- ,减到0 询问是否删除商品 点击全选 ...

  8. 前端开发工具之jQuery

    jQuery jQuery是一个轻量级的JavaScript第三方库,能够简单方便的进行JavaScript编程. jQuery选择器 1,id选择器: $("#id") 2,标签 ...

  9. tf.variable_scope 参数

    最近在看TensorFlow的变量管理,发现很多代码中tf.variable_scope()参数的数量及意义还不太清楚,特此记录: def __init__(self, name_or_scope, ...

  10. .NET C#与Java比较——Servlet

    目录 1. Servlet 和 Ashx(一般处理程序) 2. Servlet 和 JSP 3. Servlet的生命周期 4. Java Filter 和 HttpModule,ActionFilt ...