zoukankan      html  css  js  c++  java
  • python socket初探

    先看一段代码

    import socket
    import sys
    import re
    
    
    def getServerContent(url):
        host_ip = socket.gethostbyname(url)
        with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as s:
            s.connect((host_ip,80))
            message = b"GET / HTTP/1.1
    
    "
            s.sendall(message)
            reply = s.recv(4096)
            return reply
    
    if __name__ == "__main__":
        if len(sys.argv) == 2:
            url = re.compile(r"www.S+.[a-z]+")
            if url.match(sys.argv[1]):
                s = getServerContent(sys.argv[1])
                print(s)
            else:
                print("Please enter the correct url")
        else:
            print("please specify the url")
    

    这段代码的功能是连接上一个服务器,并发送http GET.比如连接上百度后会返回

    HTTP/1.1 302 Moved Temporarily
    Date: Fri, 03 Feb 2017 09:55:35 GMT
    Content-Type: text/html
    Content-Length: 215
    Connection: Keep-Alive
    Location: http://www.baidu.com/search/error.html
    Server: BWS/1.1
    X-UA-Compatible: IE=Edge,chrome=1
    BDPAGETYPE: 3
    Set-Cookie: BDSVRTM=0; path=/
    

    可以看出来,有了socket就可以进行网络间的通讯了。

    什么是socket

    在一台电脑上,一个进程和另外一个进程通信有很多种方法,比如:

    1. 信号量
    2. 全局变量
    3. 消息队列

    在网络中,我们知道IP可以唯一的标识一台电脑。但是在同一时刻,电脑中可能有很多进程需要使用网络,比如我浏览器打开两个网页,可能就打开了两个网络通信进程。那么两台电脑的两个进程间怎么通信呢?于是就有了套接字(socket)。指定了IP和端口(端口和PID绑定),一个socket建立,网络中两个进程就可以通讯了。

    socket是对传输层协议(主要是UDP和TCP)的一个封装,连接传输层和应用层。

    python中的socket

    python只是简单的对操作系统(类UNIX)socket函数进行了封装,参数都是一样的。这得益于各个操作系统都采用了类UNIX一切皆文件的思想,将网络接口抽象成一个文件,最终使得接口函数都相似(open,read,write,close)

    python中使用socket只需要 import socket即可

    关键函数

    socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    

    这里建立了一个socket,第一个参数指定使用(host,port)二维元祖来表示IP和端口号。第二个参数表示使用TCP协议。常用的还有SOCK_DGRAM表示使用UDP协议。

    代码

    客户端代码

    import socket  
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)  
    s.connect(("192.168.20.195",1234))  
    while True:  
        t=input()  
        s.send(t.encode('utf8'))   #客户端先发送信息  
        if t == "exit":  
            break  
        t=s.recv(1024).decode("utf8")  
        if t == "exit":  
            break  
        print(t)  
    s.close()
    

    服务器代码

    import socket  
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)  
    s.bind(("192.168.20.195",1234))  
    s.listen(2)  
    sock,addr=s.accept()  
    while True:  
        t=sock.recv(1024).decode('utf8')   #服务端先接收信息  
        if t == "exit":  
            break  
        print(t)  
        t=input()  
        if t == "exit":  
            break  
        sock.send(t.encode('utf8'))  
    s.close()
    

    上面两段代码建立了一个服务器和一个客户端互相发消息,两台电脑自此可以正常通讯了。

  • 相关阅读:
    codeforces689A
    codeforces222A
    codeforces553A
    2021牛客国庆集训派对day6 J
    SVM--支持向量机
    压缩感知
    范数
    LeNet详解
    卷积神经网络(CNN)详解
    BP算法实例—鸢尾花的分类(Python)
  • 原文地址:https://www.cnblogs.com/WeyneChen/p/6670656.html
Copyright © 2011-2022 走看看