停了好久没写的 python
这次学习了使用 python 搭建简单的服务端和客户端,并进行通讯。
在 kali Linux 上,使用 python2.7 的语法
TCP_Client
import socket
target_host = "0.0.0.0"
target_port = 9998
# create a socket object
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# connect the client
client.connect((target_host, target_port))
# send some data
client.send("GET / HTTP/1.1\r\nHOST: xxxx.com\r\n\r\n")
# receive some data
response = client.recv(4096)
print response
-
首先创建 socket,AF_INET 表示使用的是 IPv4 类型的 address 或者 hostname,SOCK_STREAM 表示这是一个 TCP 的 Client
-
连接服务器,使用 connect,里边使用 tuple
-
发送信息
-
接受信息
假定连接顺利并且服务器给了回应。
TCP_Server
# multi-threaded TCP server
import socket
import threading
bind_ip = "0.0.0.0"
bind_port = 9998
# this is client-handling thread
def handle_client(client_socket):
# print out what the client sends
request = client_socket.recv(1024)
print "[*] Received: %s" % request
# send back a packet
client_socket.send("ACK!")
client_socket.close()
def main():
global bind_ip
global bind_port
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# set socket options
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind((bind_ip, bind_port))
server.listen(5)
print "[*] Listening on %s: %d" % (bind_ip, bind_port)
while True:
client, addr = server.accept()
print "[*] Accepted connection from: %s:%d" % (addr[0], addr[1])
# spin up client thread to handle incoming data
client_handler = threading.Thread(target=handle_client, args=(client, ))
client_handler.start()
if __name__ == '__main__':
main()
-
创建 socket,可以使用 setsockopt 设置一下,SO_REUSEADDR 和之后的 1(开启),声明操作系统在 socket 关闭后立刻释放端口,方便重用
-
绑定 ip 和端口,使用 bind
-
开始监听,listen(),数字表示最大的连接数
-
等待接受,accept()会产生阻塞,直到接受到客户端请求的信息
-
接到请求后,使用 recv 接受信息
-
之后返回信息 使用 send
-
关闭 socket
-
这里使用了多线程 threading 模块的 Thread 类
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于