设为首页 加入收藏

TOP

Socket网络编程入门详述(一)
2018-08-06 10:54:58 】 浏览:472
Tags:Socket 网络编程 入门 详述

认识socket


socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递。我们知道网络 通信 都 是基于 ip+port(端口) 方能定位到目标的具体机器上的具体服务,操作系统有0-65535个端口,每个端口都可以独立对外提供服务,如果 把一个公司比做一台电脑 ,那公司的总机号码就相当于ip地址, 每个员工的分机号就相当于端口, 你想找公司某个人,必须 先打电话到总机,然后再转分机 。


建立一个socket必须至少有2端, 一个服务端,一个客户端, 服务端被动等待并接收请求,客户端主动发起请求, 连接建立之后,双方可以互发数据。


基本参数


Socket Families(地址簇)


socket.AF_UNIX  本机进程间通信


socket.AF_INET  IPV4(默认) 


socket.AF_INET6  IPV6


Socket Types(类型)


socket.SOCK_STREAM  流式socket,代表TCP协议(默认)


socket.SOCK_DGRAM  数据报式socket,代表UDP协议


socket方法


sk = socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)


建立socket连接对象


sk.bind(address)


  s.bind(address) 将套接字绑定到地址。address地址的格式取决于地址族。在AF_INET下,以元组(host,port)的形式表示地址。


sk.listen(backlog)


  开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。


      backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数最大为5
      这个值不能无限大,因为要在内核中维护连接队列


sk.setblocking(bool)


  是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。


sk.accept()


  接受连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。


  接收TCP 客户的连接(阻塞式)等待连接的到来


sk.connect(address)


  连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。


sk.connect_ex(address)


  同上,只不过会有返回值,连接成功时返回 0 ,连接失败时候返回编码,例如:10061


sk.close()


  关闭套接字


sk.recv(bufsize[,flag])


  接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。


sk.recvfrom(bufsize[.flag])


  与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。


sk.send(string[,flag])


  将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。即:可能未将指定内容全部发送。


sk.sendall(string[,flag])


  将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。


      内部通过递归调用send,将所有内容发送出去。


服务端步骤:


步骤:
1.server = socket.socket() 声明实例,生成连接对象
2.server.bind() 绑定要监听的端口
3.server.listen() 开始监听
4.conn,addr = server.accept()等待客户端发起连接,阻塞
5.接收数据(发送数据)
6.当客户端断开连接后,继续监听等待下一个客户端建立连接
……
关闭连接对象


代码示例:


import socket
"服务器端"


server = socket.socket() # 生成连接对象
server.bind(("localhost",6000)) # 绑定要监听的端口
server.listen(5) # 开始监听(最大允许挂起的连接)
while True:
    print("\n服务器在等待...")
    conn,addr = server.accept() # 等待客户端发起建立连接,起到阻塞作用
    # conn 是客户端链接过来而在服务器端为其生成的连接实例,addr是IP地址+端口
    print("已成功连接")
    print("连接对象:{0},地址:{1}\n".format(conn,addr))
    while True:
        try:
            data = conn.recv(1024)  # 接收数据
            # (如果客服端断开连接,此步骤将会被无限循环操作,所以一定要有检查机制)
            if data != b"000001":  # 接收到的信号不是"000001"的话就正常执行
                print("接收客户端信息:", data.decode())
                msg = input(">>输入返回客户端的数据:")
                conn.send(msg.encode(encoding="utf-8")) # 向客户端发送数据
            else:
                print("该客户已主动断开连接")
                break
        except ConnectionResetError as e:
            print("该客户机异常!已被强迫断开连接",e)

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇关于 Python 线程详述 下一篇C#集合类型大揭秘

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目