一、TCP客户端
import socket
target_host="www.baidu.com"
target_port=80
#建立一个socket对象
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#连接客户端
client.connect((target_host,target_port))
#发送一些数据
client.send("GET / HTTP/1.1\r\nHost: www.baidu.com\r\n\r\n")
#接受一些数据
response=client.recv(4096)
print(response)
首先,我们建立一个包含AF_INET和SOCK_STREAM的参数socket对象,AF_INET参数说明我们使用标准的IPv4地址或者主机名,SOCK_STREAM说明这将是一个TCP客户端,然后我们将客户端连接到服务器
存在问题:
1、我们假设我们总是连接成功,不会出现问题
2、假设客户总是先向服务器发送数据(服务器也会向你发送数据)
3、假设服务器每次都及时返回数据
二、UDP客户端
import socket
target_host="127.0.0.1"
target_port=80
#建立一个socket对象
client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#1
#发送一些数据
client.sendto("AABBCC",(target_host,target_port))#2
#接受回传数据及远程主机的信息和端口
data,addr=client.recvfrom(4096)
print(data)
1:我们将套接字类型改成SOCK_DGRAM
2:UDP是一个无连接状态的传输协议,所以不需要调用connect()函数
三、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))#(1)
server.listen(5)#(2)
print("[*] listenting on %s:%d"%(bind_ip,bind_port))
#这是客户端处理线程
def handle_client(client_socket): #(3)
#打印出客户端发送的内容
request=client_socket.recv(1024)
print("[*] received:%s" %reques)
#返还一个数据包
client_socket.send("ACK!")
client_socket.close()
while True:
client,addr=server.accept()#(4)
print("[*] Accepted connection from :%s:%d"%(addr[0],addr[1]))
#挂起客户端线程,处理传入的数据
client_handler=threading.Thread(target=handle_client,args=(client,))
client_handler.start()#(5)
我们确定服务器需要监听的ip地址和端口(1),然后我们启动监听(2)并将最大连接数设置成为5。下一步,我们让服务端进入到主循环,等待连接。客户端成功连接时(4),我们将接受到客户端套接字对象保存到client变量当中,将远程连接的细节保存到addr变量中。接着我们以handle_client为回调函数创建一个新的线程对象,将客户端套接字对象作为一个句柄传递给他,我们启动线程处理客户端连接(5)handle_client函数执行(3)执行recv()函数之后将信息发送给客户端。