python 笔记 4

本贴最后更新于 2512 天前,其中的信息可能已经沧海桑田

停了好久没写的 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 类

  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    534 引用 • 671 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...