python socket编程学习笔记
Socket是应用层与TCP/IP协议簇通信的中间层,可以看作提供给应用层所用的接口.
Python中,主要用socket.socket([family[,type[,proto]]])方法来创建一个socket
family-套接字地址结构,有AF_INET AF_INET6和AF_UNIX.
type - 数据传输的类型,广泛使用的有SOCK_STREAM(数据流)和SOCK_DGRAM(数据报文)
SOCK_STREAM是面向连接的,SOCK_DGRAM是无连接的,如ATM和TCP协议属于SOCK_STREAM类型,
而IRDA和UDP协议属于SOCK_DGRAM类型.
proto - 指明所要接收的协议包
1 vi server_socket1.py 2 ------------------------------------------------------------------------------------------------- 3 #!/usr/bin/env python 4 #-*-coding:utf-8-*- 5 import socket 6 import sys 7 SERVER_SOCKET = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 8 HOST = '' 9 PORT = 30000 10 SERVER_SOCKET.bind((HOST,PORT)) 11 SERVER_SOCKET.listen(10) 12 print "TCP SERVER START......" 13 14 try: 15 while 1: 16 connection,address = SERVER_SOCKET.accept() 17 print ("Client Connection Address:",address) 18 connection.send("Welcome to ftp server:") 19 data = connection.recv(4096) 20 print (str(data)) 21 connection.close() 22 print "TCP server is finshed" 23 except KeyboardInterrupt: 24 print "\033[41;36m Warning: You operate the CTRL+ C,program interrupt and quit!!! \033[0m" 25 sys.exit() 26 SERVER_SOCKET.close() 27 ------------------------------------------------------------------------------------------------- 28 29 vi client_socket.py 30 ------------------------------------------------------------------------------------------------- 31 #!/usr/bin/env python 32 #-*-coding:utf-8-*- 33 34 import socket 35 print "CLIENT START...." 36 CLIENT_SOCKET = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 37 38 HOST= "192.168.0.12" 39 PORT = 30000 40 CLIENT_SOCKET.connect((HOST,PORT)) 41 #while 1: 42 #INPUT = raw_input("Input information:") 43 CLIENT_SOCKET.send("hello socket_server,Im socket_client!") 44 Received_data = CLIENT_SOCKET.recv(4096) 45 print "Receve from server:",repr(Received_data) 46 CLIENT_SOCKET.close() 47 -------------------------------------------------------------------------------------------------
python 编写server的步骤:
第一步是创建socket对象,调用socket构造函数:
socket = socket.socket(family,type)
family参数代表地址家族,可为AF_INET或AF_UNIX,AF_INET家族包括Internet地址,
AF_UNIX家族用于同一台机器上的进程间通信,type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)
第二步是将socket绑定到指定地址,这是通过socket对象的bind方法来实现的:
socket.bind( address )
由AF_INET所创建的套接字,address地址必须是一个双元素元组,格式是(host,port)如果端口号正在使用,主机名不正确或端口已被保留,
bind方法将引发socket.error异常.
第三步是使用socket套接字的listen方法接收连接请求.
socket.listen( backlog )
backlog指定最多允许多少个客户连接到服务器,它的值至少为1,收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求.
第四步是服务器套接字通过socket的accept方法等待客户请求一个连接.
connection, address = socket.accept()
调用accept方法时,socket会时入"waiting"状态,客户请求连接时,方法建立连接并返回服务器,accept方法返回一个含有两个元
素的元组(connection,address),第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素address是
客户的Internet地址.
第五步是处理阶段,服务器和客户端通过send和recv方法通信(传输数据)服务器调用send,并采用字符串形式向客户发送信息,send
方法返回已发送的字符个数,服务器使用recv方法从客户接收信息,调用recv时,服务器必须指定一个整数,它对应于可通过本次方法
调用来接收的最大数据量,recv方法在接收数据时会进入"blocked"状态,最后返回一个字符串,用它表示收到的数据,如果发送的数据
量超过了recv所允许的,数据会被截短,多余的数据将缓冲于接收端,以后调用recv时,多余的数据会从缓冲区删除(以及自上次调用recv
以来,客户可能发送的其它任何数据)
传输结束,服务器调用socket的close方法关闭连接。
python编写client的步骤:
创建一个socket以连接服务器:socket = socket.socket( family, type )
使用socket的connect方法连接服务器。对于AF_INET家族,连接格式如下:
socket.connect( (host,port) )
host代表服务器主机名或IP,port代表服务器进程所绑定的端口号,如连接成功,客户就可通过套接字与服务器通信,如果连接失败,
会引发socket.error异常。
处理阶段,客户和服务器将通过send方法和recv方法通信。
传输结束,客户通过调用socket的close方法关闭连接。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步