Python网络编程(socket编程)

默认分类 | 2019-08-16 23:13:55 | 阅读 464 次 | 评论(0)

环境:Win10    python - 3.7


Socket工作原理和基本概念

        Socket的中文翻译是套接字,它是TCP/IP网络环境下应用程序与底层通信驱动程序之间运行的开发接口,它可以将应用程序与具体的TCP/IP隔离开来,使得应用程序不需要了解TCP/IP的具体细节,就能够实现数据传输。


         在网络应用程序中,Socket通信是基于客户端/服务器结构。客户端是发送数据的一方。服务器时刻准备接受来自客户端的数据,对做出响应.

实现基于tcp网络通信与现实中打电话很像:


1)      客户端(相当于打电话的一方),需要了解服务器的ip地址,如果该服务器有多个网络应用程序,单单ip地址则不够,这时候socket通信借用tcp/ip中端口的概念,不同应用程序使用不同端口通信(这就很类似电话分机)。

2)      服务器应用程序必须早于客户端启动,并在指定ip地址和端口上执行监听,端口被占用,服务器则无法正常启动。(服务器处于监听状态就类似电话接通好电话线,等待被拨打的状态)

3)      客户端在申请发送数据时,服务器端应用程序必须有足够的时间响应才能进行正常通信(电话响,却无人接听)。通常情况下,服务器的应用程序都需要具备同时处理多个客户端请求的能力,应用程序设计不合理或访问量过高都会导致响应超时。

4)      使用Socket协议进行通信的双方必须使用相同的通信协议,Socket支持的底层通信协议包括tcp和udp两种,通信过程中,双方还必须采用相同的字符编码,按照约定的方式进行通信(打电话时,双方必须语言相同,才能进行信息交流)

5)      通信时,物理网络必须保持通畅,否则通信将会中断(电话线有效,且连接正常)。

6)      通信结束之前,客户端和服务器端都可以中断连接(任何一方都可以挂电话)。

TCP是基于连接的通信协议,即先建立稳定连接后,再数据传输

如果Socket通信基于UDP,则数据传输前不需要连接,类似发短信或发电报,即使对方不在线,也可以发送数据,发送的数据在指定时间没有得到对方响应,则视为操作超时,可以选择超时后重新发送数据。

相关函数:

1.socket()函数

        socket()函数用于创建与指定的服务提供者绑定套接字,函数原型如下:

        socket=socket.socket(familly,type)

参数说明如下:

        familly,指定协议的地址家族,可为AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信。

type,指定套接字的类型。

套接字类型

说    明

SOCK_STREAM

提供顺序、可靠、双向和面向连接的字节流数据传输机制,使用TCP

SOCK_DGRAM

支持无连接的数据报,使用UDP

SOCK_RAW

原始套接字,可以用于接收本机网卡上的数据帧或者数据包

2.bind()函数

bind()函数可以将本地地址与一个Socket绑定在一起,函数原型如下:

socket.bind( address )

参数address是一个双元素元组,格式是(host,port)。host代表主机,port代表端口号。

3.listen()函数

listen()函数可以将套接字设置为监听接入连接的状态,函数原型如下:

listen(backlog);

参数backlog指定等待连接队列的最大长度。

4.accept()函数

在服务器端调用listen()函数监听接入连接后,可以调用accept()函数来等待接受连接请求。accept()的函数原型如下:

connection, address = socket.accept()

调用accept()方法后,socket会进入waiting状态。客户请求连接时,accept()方法会建立连接并返回服务器。accept()方法返回一个含有两个元素的元组(connection,address)。第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素 address是客户的Internet地址。



5.recv()函数

调用recv()函数可以从已连接的Socket中接收数据。recv()的函数原型如下:

buf = sock.recv(size)

参数sock是接收数据的socket对象,参数size指定接收数据的缓冲区的大小。recv()的函数的返回接收的数据。



6.send()函数

调用send()函数可以在已连接的Socket上发送数据。send()的函数原型如下:

sock.recv(buf)

参数sock是在已连接的Socket上发送数据。参数buf是也要已连接的Socket上发送数据。

7.close()函数

close ()函数用于关闭一个Socket,释放其所占用的所有资源。socket()的函数原型如下:

s.closesocket();

参数s表示要关闭的Socket。

 connection.close()


使用socket通讯的简易服务

import socket 
import sys 
# 创建 socket 对象 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
# 获取本地主机名 
host = socket.gethostname()
port = 9999  
# 绑定端口号 s.bind((host, port)) 
# 设置最大连接数,超过后排队 
s.listen(5) 
# 等待客户端连接 
while True:
    conn, addr = s.accept() # 建立客户端连接  
  print("连接地址: %s" % str(addr))
    msg = '|------成功连接服务端!------|'  
 conn.send(msg.encode('utf-8'))
    conn.close() # 关闭连接


使用socket通讯的简易客户端


 
import socket 
import
sys
 创建 socket 对象 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname() 
# 设置端口号 
port = 9999  
# 连接服务,指定主机和端口 
s.connect((host, port)) 
# 接收小于 1024 字节的数据  
msg = s.recv(1024)
s.close() print (msg.decode('utf-8'))



程序写完之后先要运行服务端,在运行客服端,如果是两台电脑之间的测试,客服端的ip地址需要改变。

运行结果

                    |------成功连接服务端!------|

文章评论,共0条
游客请输入验证码
文章归档
最新评论