TCP客户端
import socket
target_host="www.baidu.com"
target_port=80
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 建立一个包含AF_INET,SOCK_STREAM参数的socket对象。其中AF_INET说明使用的是标准的IPv4,SOCK_STREAM(面向连接)说明这将是一个TCP客户端。
client.connect((target_host,target_port)) # 连接客户端
client.send("GET / HTTP/1.1\r\nHost: baidu.com\r\n\r\n") # 发送一些数据
response=client.recv(6049) # 接受一些数据
print response
UDP客户端
import socket
target_host="127.0.0.1"
target_port=80
client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 建立一个socket对象,套接字类型改为SOCK_DGRAM(非连接)
client.sendto( "AAABBBCCC",(target_host,target_port)) # 调用 sendto()(发送UDP数据)函数将数据发送到想要发送的服务器上,因为UDP是无连接状态的传输协议
data, addr=client.recvfrom(4096) # 调用recvfrom()(
接受UDP数据,与recv()类似,但返回值是(data,address),其中data是包含接受数据的字符串,address是发送数据的套接字地址)接收返回的UDP数据包
print data
TCP服务器
import socket
import threading
bind_ip="0.0.0.0"
bind_port= 9999
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind((bind_ip,bind_port)) # 确定服务器需要监听的IP地址和端口
server.listen(5) # 启动监听,并将最大连接数设为5
print "[*] Listening on %s:%d" % (bind_ip,bind_port)
def handle_client(client_socket): # 客户处理线程
request=client_socket.recv(1024) # 打印客户端发送的到的内容
print "[*] Received: %s" % request
client_socket.send("ACK!") # 返还一个数据包
client_socket.close()
while True: # 让服务器进入主循环中,在这里等待连接
client,addr=server.accept() # 当一个客户端成功连接时候,接收到的客户端的套接字对象并保存在变量client中,将远程连接的细节保存在addr中
print "[*] Accepted connection from: %s:%d" % (addr[0],addr[1])
client_handler=threading.Thread(target=handle_client,args=(client,)) # 以handle_client函数作为回调函数创建一个新的线程对象,将客户端套接字作为一个句柄传递给它。
client_handler.start()