我们都知道,在网络中通过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 點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦