python3学习之socket

@开启博客之路

python3学习之socket

socket的创建

1,需要加载socket模块,import socket
2,创建套接字socket.socket(socket_family, socket_type, protocol=0),
socket_family:
AF_UNIX:用于本地进程间通信的套接字,发送的数据到达内核缓冲区,内核根据指定路径名将数据拷贝到接收端缓冲区,速度快,节省CPU
AF_INET(IPV4):既可用于本地进程间通信,又可用于不同主机间通信。发送的数据到达内核缓冲区,经过层层编码通过网卡发送到接收端,接收端又经过层层解码到达接收端应用进程。
AF_INET6(IPV4)。
socket_type:
SOCK_STREAM: 面向连接的套接字,TCP
SOCK_DGRAM:无连接的套接字,UDP
SOCK_RAW:原始套接字。
protocol:一般默认为0。

server

流程如下:
创建:创建套接字,
server = socket.socket(socket_family, socket_type, protocol=0)
绑定:将地址(host,port)元组绑定到套接字上,
server.bind((host,port))
监听:服务器在绑定的地址处监听,参数表示可以排队的最大连接数,一般设置为5,
server.listen(5)
连接:服务器监听到客户端请求之后,接收请求,建立起了连接,
client,add = server.accept()#阻塞式,返回元组

client

创建套接字,
client= socket.socket(socket_family, socket_type, protocol=0)
连接服务器,address为元组(host,port),
client.connect((ip_server,port))

公共

recv(buffersize),接收数据,数据以字符串形式返回,bufsize指定要接收的最大数据量,一般为1024,#阻塞式
send(string),发送数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小
sendall(string),完整发送string数据到连接的套接字,成功返回None,失败则抛出异常。
close(),关闭套接字

代码示例

#server
#服务器添加多线程,接收多个客户端消息,当收到"finished",主动与客户端断开,正常通讯则自动发送当前时间。
import socket
from threading import Thread#多线程
import time
client_connect = []

def transThreadFunc(connec_of_client):#线程函数
	while(1):
		try:
			message = connec_of_client.recv(1024)#接收消息
			print("server recevice message:",message.decode())
		except (ConnectionResetError,ConnectionAbortedError):
   			connec_of_client.close()
   			break
   		else:
   			if message.decode() == 'finished':                    #结束对话标志
    			try:
    				client_connect.remove(connec_of_client)
     				connec_of_client.close()
     				break
    			except Exception as e:
     				break
     			else:
			    try:
			     	send_status = connec_of_client.sendall(show().encode())
			    	except Exception as e:
			     		break

def show():#
	currentTime = time.strftime("%Y-%m-%d  %H:%M:%S",time.localtime())
 	return currentTime
 	
if __name__ == "__main__":
 	global server_socket
 	server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)#IPv4,TCP,协议自选
 	ip = "192.168.0.12"
 	port = 9999
 	server_socket.bind((ip,port))#绑定
 	server_socket.listen(5)#监听

	while(1):
  		connect,add = server_socket.accept()#阻塞
  		if connect not in client_connect:
	   		client_connect.append(connect)
	   		print(client_connect)
	   		trans_thread = Thread(target = transThreadFunc,args = (connect,))#多线程,接收多个客户端请求
	   		trans_thread.start()
  		else:
  			pass			   		
#client
#客户端与服务器通信,当发送"finished"则主动与服务器断开。
import socket
# import threading
import time

def show():
	currentTime = time.strftime("%Y-%m-%d  %H:%M:%S",time.localtime())	
	return currentTime

if __name__ == '__main__':	
	client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)#IPv4,TCP,协议自选,创建套接字
	ip_server = "192.168.0.12"
	port = 9999
	client_socket.connect((ip_server,port))#连接服务器
	print(client_socket)

while(1):
	sendDatas = input("cilent send message:")
	sendStatus = client_socket.sendall(sendDatas.encode())#发送信息
	if sendDatas == "finished":
		client_socket.close()
		break
	else:
		message = client_socket.recv(1024)#接收信息
		print("cilent recieve message = ",message.decode())
#执行结果
#server
[<socket.socket fd=820, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.0.12', 9999), raddr=('192.168.0.245', 60471)>]
server recevice message: hello
server recevice message: hello ha
server recevice message: finished
#client
<socket.socket fd=556, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.0.245', 60471), raddr=('192.168.0.12', 9999)>
cilent send message:hello
cilent recieve message =  2020-07-15  15:19:28
cilent send message:hello ha
cilent recieve message =  2020-07-15  15:19:45
cilent send message:finished

猜你喜欢

转载自blog.csdn.net/Lhhxxdhr/article/details/106545695