zoukankan      html  css  js  c++  java
  • python_socket (套接字)

    socket是计算机网络通信的基本的技术之一。如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的。

    网络上两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket,应用程序通过socket向网络中发出消息,或者接收消息。

    socket是应用层与TCP/IP协议族的中间抽象层,它是一组接口,把复杂的TCP/IP协议族封装为几个简单的接口提供给应用层调用,实现程序在网络中的通信

    socket仅仅是一个调用接口,为了方便程序员针对TCP或者UDP编程的接口。

     socket的七个方法

      服务端套接字绑定IP端口:bind()

      客户端套接字连接服务器:connect()

      服务端套接字监听:listen()

      套接字发送消息:send()

      服务端监听套接字同意连接:accept()

      套接字接受消息:recv()

      套接字关闭连接:close()

    创建socket

     导入socket模块: import socket

     创建socket对象:socket.socket()

    基本使用

    注意: 服务端是通过accept生成的对等连接套接字来和客户端通信的

    注意: aeecpt和recv是会阻塞的,当没有数据来的时候阻塞等数据过来

    xshell 中命令执行

    代码执行:

    写一个不断接受(while True)用户连接的服务端,它的作用是把客户端发来的数据原封不动的返回。

    #服务端Linuxwindow系统下:处理命令并返回
    import socket
    
    #声明类型,生成socket链接对象
    server = socket.socket()
    
    #监听接收端口元组(本地,端口),绑定要监听的端口
    server.bind(('127.0.0.1', 8888))
    
    #1.监听
    #2.“5”最大监听数,允许多少人在排队
    server.listen(5)
    
    print("执行到这, 上面没问题了")
    
    #循环锁定访问客户端
    while True:
    
        #1.等待客户端 #会返回链接的标记位conn,与连接的地址
        #2.客户端同过conn,addr进行通话
        #3.conn就是客户端连接过来而在服务器端为其生成的一个连接实例
        conn, addr = server.accept()
    
        #查看标记位与IP地址
        print(conn, addr)
    
        #循环处理客户端请求
        while True:
    
            #1.接收数据,1024字节
            #2.如果发不完会存在缓冲去,下次在发送。
            #3.缓冲区每次最多发32768字节
            #4.每个系统不同,超出数值会有限制。
            data = conn.recv(1024)
    
            #返回
            print(data)
    
            #判断是否为空。
            if not data:
                break
    
            #输入一个值,与客户端通讯
            aa = input("--->>:")
    
            #解决报错:TypeError: a bytes-like object is required, not 'str'
            bb = aa.encode()
    
            # 传输
            conn.send(bb)
    
    #关闭链接
    server.close()

    写一个客户端来测试上面的服务端

    #客户端Linux、window系统下:输入命令通过服务端返回
    import  socket
    
    #声明协议类型,同时生成socket连接对象
    client = socket.socket()
    
    #链接地址和端口,元组(本地,端口)
    client.connect(('127.0.0.1', 8888))
    
    #使用input循环向服务端发送请求
    while True:
        
        msg = input("-->>:").strip()
        if len(msg) == 0:
            continue
        
        #发送数据 b将字符串转为bys类型
        client.send(msg.encode("utf-8"))
        
        #接收服务器端的返回,需要声明收多少,默认1024字节
        id = 1024
        data = client.recv(id)
        
        #打印data是recv的data
        print("recv: %s" % data)
    
    #关闭接口
    client.close()

    作者:含笑半步颠√

    博客链接:https://www.cnblogs.com/lixy-88428977

    声明:本文为博主学习感悟总结,水平有限,如果不当,欢迎指正。如果您认为还不错,欢迎转载。转载与引用请注明作者及出处。

  • 相关阅读:
    hdu 4476 Cut the rope (2-pointer && simulation)
    hdu 1286 找新朋友 (容斥原理 || 欧拉函数)
    函数存储的另一种思路
    grunt 入门 应用grunt对代码进行压缩
    sublime flatLand 主题
    如何应用r.js对requirejs下的js代码合并
    如何在requirejs下引用bootstrap
    学习在requirejs下如何使用underscore.js模板
    应用js函数柯里化currying 与ajax 局部刷新dom
    js 函数arguments一种用法
  • 原文地址:https://www.cnblogs.com/lixy-88428977/p/9625804.html
Copyright © 2011-2022 走看看