zoukankan      html  css  js  c++  java
  • Pyhont 网络编程【第一篇】初始Socket网络套接字

    一、什么是socket:

      Socket 别名 “网络套接字”,指网络通信链句柄 其实就是一堆网络信息(ip+端口) 建立起的链接称之为socket,Socket的英文原义是“孔”或“插座”,用来实现不同主机之间的通信。网络服务器中可能会提供多种网络服务每种服务都会创建一个socket进行和客户端通信并且对应绑定到一个端口,比如ftp、http分别对应20/21,80端口

    二、Socket 类方法:

        socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)
        参数一:地址簇
            socket.AF_INET //基于网络的TCP-IPv4地址簇
            socket.AF_INET6 //基于网络的TCP-IPv6地址簇
            socket.AF_UNIX //只能够用于单一的Unix系统进程间通信,也叫AF_LOCAL,基于本地文件的
        参数二:套接字类型
            socket.SOCK_STREAM //流套接字socket  TCP协议
            socket.SOCK_DGRAM //数据包式socket  UDP协议
            socket.RAW  //原始套接字socket  用于处理普通套接字类型无法处理的协议 比如:icmp
        参数三:
            0(默认)与特定的地址家族相关的协议,如果是 0 ,则系统就会根据地址格式和套接类别,自动选择一个合适的协议


    三、Socket 对象的方法


    #创建一个socket对象server_socket
        server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)


        server_socket.bind((host,port))
            将端口绑定到ip创建一个socket套接字
        server_socket.listen(5)
            开启socket监听,上面的5代表最多可以建立5个连接(非并发值)
        server_socket.connect((host,port))
            连接到远程socket套接字,如果连接不到则返回socket.error错误
        server_socket.settimeout(5)
            设置socket等待超时时间这里单位为秒 这里的5就代表5s
        server_socket.send()
            客户端将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。
        server_socket.sendall()
            客户端将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常
        conn.addr=server_socket.accpet()
            接收连接并返回(conn,addr),conn为新的套接字对象用于数据交互,addr就是远程socket对象的ip和端口以元组的方式返回
        conn.send('string')
            服务端将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。
        conn.sendall('string')
            服务端将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。
        conn.recv(1024)
            服务端接收socket数据,1204为最大接收的socket数据字节大小为字符串
        conn.recvfrom()
            作用和recv类似 返回值为(data,address),dada为字符串数据 address为远程socket地址
        conn.close()
            关闭socket连接
        server_socket.setblocking(bool)
            是否开启阻塞模式,默认为True开启状态 False 为关闭状态,如果关闭阻塞模式如果accept、recv接收不到socket连接、socket数据则报错
        server_socket.close()
            关闭socket服务
        server_socket.sendto(string,(host,port))
            发送string数据用于UDP数据发送 host 为远程地址 port为远程端口
        server_socket.getpeername()
            获取远程socket地址 返回值为元组(host,port)
        server_socket.getsockname()
            获取本机socket地址 返回值为元组(host,port)
        注:
            accept,recv默认为阻塞(setblocking的值为True)状态,即等待连接(accept)、等待接收数据(recv)


    四、socket的连接建立以及数据交互原理、步骤

    如下图所示:

    四、举例:

      利用socket实现c(client)/s(server)模式可以进行简单的信息交互,先执行服务端然后执行客户端 可以看到server端和client端有数据交互

    server端代码

     1 #-*- coding:utf-8 -*-
     2 #/usr/bin/env python
     3 import socket
     4 server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
     5 hosts = ('localhost',8081)
     6 server_socket.bind(hosts)
     7 server_socket.listen(5)
     8 
     9 while True:
    10     print 'wariting......'
    11     count,address = server_socket.accept()
    12     client_data = count.recv(1024)
    13     print client_data
    14     count.sendall('server message')
    15     count.close()
    16 server_socket.close()
    Server

    client端代码

     1 #-*- coding:utf-8 -*-
     2 #/usr/bin/env python
     3 import socket
     4 client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
     5 hosts = ('127.0.0.1',8081)
     6 client_socket.connect(hosts)
     7 client_socket.settimeout(5)
     8 
     9 print 'client'
    10 client_socket.sendall('client message')
    11 server_data = client_socket.recv(1024)
    12 print server_data
    13 client_socket.close()
    Client
  • 相关阅读:
    每日日报2020.9.30 1905
    每日日报2020.10.7 1905
    每日日报2020.10.2 1905
    每日日报2020.9.28 1905
    程序员修炼之道:从小工到专家 九月读书心得 1905
    每日日报2020.9.27 1905
    每日日报2020.9.29 1905
    每日日报2020.10.6 1905
    每日日报2020.10.5 1905
    每日总结2
  • 原文地址:https://www.cnblogs.com/Alanpy/p/5056935.html
Copyright © 2011-2022 走看看