我们都知道,在网络中通过IP地址来识别主机,在一台主机中通过端口号来识别不同的应用进程,那么把IP地址和端口号组合起来就可以唯一地识别网络中一台主机及其上的一个应用,这个组合就是套接字(socket),它实际上就是一个通信断点,即
套接字=(主机IP地址,端口号)
在使用python开发项目的时候可以使用很多第三方python工具创建网络客户端和服务端,这些工具的核心模块是socket模块。
直接上代码。
建立TCP客户端
import socket #目标主机 target_add="www.baidu.com" #端口号 target_port = 80 #建立一个socket对象 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #连接客户端 client.connect((target_add,target_port)) #发送一些数据 client.send(("GET / HTTP/1.1\r\nHost:baidu.com\r\n\r\n").encode()) #接收一些数据 response = client.recv(1024) print(response)
建立UDP客户端
import socket #目标主机 target_add="127.0.0.1" #端口号 target_port = 80 #建立一个socket对象 client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #这里由socket.SOCK_STREAM改为socket.SOCK_DGRAM #发送一些数据 client.sendto(("ASDFGHJKL").encode(),(target_add,target_port)) #这里是sendto #接收一些数据 data,addr = client.recvfrom(1024) #这里是recvfrom print(data)
这两个客户端一看长得差不多,UDP客户端代码在TCP客户端代码上面稍微改一下就可以了。写UDP客户端时没有连接,这是因为UDP是一个无连接的传输协议。
客户端写了,那么来写一个服务端。
TCP服务端
import socket import threading bind_ip = "127.0.0.1" bind_port = 9999 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #启动监听 server.bind((bind_ip,bind_port)) #最大连接数设置为5 server.listen(5) print(("[*] listeing on %s:%d" % (bind_ip,bind_port)).encode()) #客户处理线程 def handle_client(client_socket): request = client_socket.recv(1024) print(("[*] received: %s" % request).encode()) client_socket.send(("ACK").encode()) client_socket.close() while True: #将接收到的客户端套接字对象保存到client中,将远程连接的细节保存到addr中 client,addr = server.accept() print("[*] accepted connection from: %s:%d" % (addr[0],addr[1])) #创建线程对象 client_handler = threading.Thread(target=handle_client,args=(client,)) #启动线程 client_handler.start()
把上面的TCP客户端代码改下IP和端口,运行这两段代码,让它们实现通信,运行后服务器端会得到这样的结果
b'[*] listeing on 127.0.0.1:9999'
[*] accepted connection from: 127.0.0.1:3331
b"[*] received: b'asd'"
TCP客户端代码给成这样就行了:
import socket #目标主机 target_add="127.0.0.1" #端口号 target_port = 9999 #建立一个socket对象 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #连接客户端 client.connect((target_add,target_port)) #发送一些数据 client.send(("asd").encode()) #接收一些数据 response = client.recv(1024) print(response)
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦