您的位置:首页 > 理论基础 > 计算机网络

python学习之路-socket网络编程-day07

2017-08-06 16:12 751 查看
大纲:

1.socket

2.socketserver

一.socket简介(取自百度百科)

1.概念

socket又称作套接字,作为BSD UNIX的进程通信机制,socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口

2.socket的作用

网络上的两个程序通过一个双向的通信连接实现数据的交换。

3.socket连接的过程

根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。

(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

(2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

二.socket编程实例讲解

1.实例1—客户端和服务器端单次收发

#服务器端
import socket
server=socket.socket()
server.bind(("localhost",6969))#绑定需要监听的主机的端口
server.listen(1)#监听
print("==it is begin==")
conn,addr=server.accept()#等待接受连接,会返回两个值,conn是将客户端连接,在服务器端生成一个实例,addr返回的IP地址
print(conn,addr)
print("数据来啦,准备开始接受哦")
data=conn.recv(1024)#开始接受数据
print("recv:",data)
conn.send(data)#开始接收数据
server.close()#关闭客户端


#客户端
import socket  #导入模块
client=socket.socket()#定义socket类型
client.connect(("localhost",6969))#建立连接,(ip,port)
client.send(b"hello world")#发送数据给服务器端,只能发送bytes类型
data=client.recv(1024)#以1024个字节=1K接收数据,官方建议不超过8192字节,把接收的数据定义为变量
print("recv:",data)#打印收到的数据内容
client.close()#关闭客户端


总结:运行的时候先运行服务器端再运行客户端

以上的socket模式只能够发送和接受一次,那么怎样实现反复的收发通讯呢?请看实例2

实例2—客户端和服务器端反复收发

#客户端
import socket  #导入模块
client=socket.socket()#定义socket类型
client.connect(("localhost",6969))#建立连接,(ip,port)
while True:
msg=input(">>:").strip()#发送的内容不能是空,假如是空,程序执行会卡死
if len(msg)==0:
continue
client.send(msg.encode("utf-8"))#发送数据给服务器端,只能发送bytes类型
data=client.recv(1024)#以1024个字节=1K接收数据,官方建议不超过8192字节,把接收的数据定义为变量
print("recv:",data.decode())#打印收到的数据内容
client.close()#关闭客户端


#服务器端
import socket
server=socket.socket()
server.bind(("localhost",6969))#绑定需要监听的主机的端口
server.listen(1)#监听
print("==it is begin==")
while True:#-----loop1
conn,addr=server.accept()#如果客户端断开后就去接受新的数据
print(conn,addr)
print("数据来啦,准备开始接受哦")
while True:
data=conn.recv(1024)#开始接受数据
if not data#客户端断开的话就是空数据,假如连接断开就会回到loop1,继续寻求新的连接
break
print("recv:",data)
conn.send(data)#开始接收数据
server.close()#关闭客户端


总结:现在只能实现一个客户端对应一个服务器端的一对一的反复通讯,其余客户端均处于挂起状态(这里补充一点,最多可以有5个客户端挂起—server.listen(5))

但是现实生活中是开启一个服务器端,当其中一个客户端断开发生异常,其余客户端可以继续执行程序,怎样实现呢?

实例3一个服务器端和多个客户端的数据交互—通过socket实现简单的ssh服务

#客户端
import socket  #导入模块
client=socket.socket()#定义socket类型
client.connect(("localhost",9999))#建立连接,(ip,port)
while True:
msg=input(">>:").strip()#发送的内容不能是空,假如是空,程序执行会卡死
if len(msg)==0:continue
client.send(msg.encode("utf-8"))#发送数据给服务器端,只能发送bytes类型
cmd_rec_size=client.recv(1024)#客户端先接收数据的大小
print("数据的大小为:",cmd_rec_size)
received_size=0
received_data = b''
while received_size<int(cmd_rec_size.decode()):#cmd_rec_size=>socket默认是bytes类型传输数据,所以需要把它先转化为str
#已经接收到的数据大小<实际需要接收的数据大小,则继续接收数据
data=client.recv(1024)#以1024个字节=1K接收数据,官方建议不超过8192字节,把接收的数据定义为变量
received_size+=len(data)#每次接收到的数据大小(每次接收到的数据都可能小于1024,所以len(data))
received_data += data

else:
print("数据已经全部接收完毕")
print(received_data.decode())  # 打印收到的数据内容
client.close()#关闭客户端


这里写代码片
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: