一、socket概念
socket(简称套接字)是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于socket来完成通信的,例如常用的浏览网页、qq聊天、收发邮件等等。
二、创建socket
在环境中使用socket模块的socket函数就能创建一个socket
import socket
socket.socket(AddressFamily,Type)
其中带有两个参数:
AddressFamily:可以选择AF_INET(用于internet进程间通信)或者AF_UNIX(用于同一台机器进程间通信),实际常用AF_INET
Type:套接字类型,可以是SOCK_STREAM(流式套接字,主要用于TCP协议)或者SOCK_DGRAM(数据报套接字,主要用于UDP协议)
创建一个tcp socket(udp socket修改参数即可)
import socket
if __name__ == '__main__':
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.close()
创建UDP客户端并使用NetAssist连接进行测试
import socket
if __name__ == '__main__':
#创建套接字
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#设置要访问的IP地址及端口
des_addr = ('127.0.0.1',666)
#发送消息
s.sendto('hello'.encode(),des_addr)
#关闭套接字
s.close()
创建UDP服务端并使用NetAssist连接进行测试
import socket
if __name__ == '__main__':
#创建套接字
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#绑定端口
s.bind(('',666))
#接收信息
while True:
data = s.recvfrom(1024)
info = data[0].decode()
ip_addr = data[1][0]
print(info,ip_addr)
接收结果为?
?
创建TCP客户端并使用NetAssist连接进行测试
import socket
if __name__ == '__main__':
#创建套接字
tcp_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#目的信息
server_ip = input('server_ip:')
server_port = int(input('server_port:'))
#连接服务器
tcp_client.connect((server_ip,server_port))
#提示用户输入数据
send_data = input('send_data:')
tcp_client.send(send_data.encode('gbk'))
#接收对方发送过来的数据,最大接收1024个字节
recvdata = tcp_client.recv(1024)
print('接收到的数据为:',recvdata.decode('gbk'))
#关闭套接字
tcp_client.close()
?创建TCP服务端并使用NetAssist连接进行测试
import socket
if __name__ == '__main__':
#创建套接字
tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定本地信息
tcp_server.bind(('',456))
#使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,用来接收别人的连接
tcp_server.listen(128)
#如果有新的客户端来连接服务器,那么就产生一个新的套接字专门为这个客户端服务
#client_socket用来为这个客户端服务
#tcp_server就可以等待其他新的客户端与之建立连接
client_socket,clientaddr = tcp_server.accept()
#接收对方发送过来的数据,最大接收1024个字节
recvdata = client_socket.recv(1024)
print('接收到的数据为:',recvdata.decode('gbk'))
#发送数据到客户端
client_socket.send('thank you'.encode('gbk'))
#关闭该客户端套接字
client_socket.close()
?
?
?
|