Python基础---网络编程2

1.socket套接字发展史

  套接字起源于20世纪70年代加利福尼亚大学伯克利分校版本的Unix,即人们所说的 BSD Unix。 因此,有时人们也把套接字称为“伯克利套接字”或“BSD 套接字”。一开始,套接字被设计用在同 一台主机上多个应用程序之间的通讯。这也被称进程间通讯,或 IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。

基于文件类型的套接字家族: AF_UNIX

  unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信.

基于网络类型的套接字家族: AF_INET

  还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现.在所有地址的家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是大部分时候我们都使用AF_INET.

2.基于TCP协议的socket简单通信

  python中的socket模块是一个与网络通信相关的模块,是在应用层与传输层中间的一个抽象层,socket就像一个接口,通过这个接口可是实现简单的网络通信.

server端:

import socket

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('IP地址', 端口))
server.listen()
conn,addr = server.accept()
from_client_data = conn.recv(1024)
print(from_client_data.decode('utf-8'))
conn.send(from_client_data)        # 回传给客户端,以字节传输
conn.close()
server.close()

client端:

import socket

client = socket.socket()
client.connect(('服务端ip', 服务端-端口))
client.send('哈哈'.encode('utf-8'))
from_server_data = client.recv(1024)
print(from_server_data.decode('utf-8'))
client.close()

3.循环通信,循环连接,

server端:

import socket
server = socket.socket(socket.AF_NET,socket.SOCK_STREAM)  # 默认可以不写
server.bind(('本地回环地址',端口))
server.listen(5)
while True:
    con,addr = server.accept()                  # 实现了循环连接
    while True:                          # 实现了循环通信
        try:
            client_data = con.recv(1024)            
            print(client_data.decode('utf-8'))
            ret = input('>>>').strip()
            con.send(ret.encode('utf-8'))
        except Exception:
            break
    con.close()
server.close()

client端:

import socket
client = socket.socket(socket.AF_NET,socket.SOCK_STREAM)
client.connect(('服务器ip',服务器端口))
while True:
    msg = input('>>>')
    if msg.upper() == 'Q': break
    client.send(msg.encode('utf-8'))
    server_data = client.recv(1024)
    print(data.decode('utf-8'))
client.close()

4.利用subprocess实现远程操控

  客户端输入一个命令,通过网络传输至服务器,服务器后端运行此命令,将此命令通过网络传输返回给客户.

server端:

import socket
import subprocess
server = socket.socket()
server.bind(('回环地址', 端口))
server.listen(5)
while True:
    conn,addr = server.accept()
    while True:
        try:
            cmd = conn.recv(1024).decode('utf-8')
            obj = subprocess.Popen(cmd,
            shell=True,
          stdout=subprocess.PIPE,
          stderr=subprocess.PIPE
          )
        right_msg = obj.stdout.read()
        error_msg = obj.stderr.read()
     except Exception:
       break
  conn.close()

client端:

import socket
client = socket.socket()
client.connect(('服务端ip',端口号))
while True:
    try:
        cmd = input('>>>').strip()
        if cmd.upper() == 'Q': break
        client.send(cmd.encode('utf-8'))
        msg = client.recv(1024)
        print(msg.decode('gbk'))    # 在subprocess中,服务端返回的信息默认编码为gbk
    except Exception:
        break
client.close()

5.socket的更多方法

服务端套接字函数
s.bind()    绑定(主机,端口号)到套接字
s.listen()  开始TCP监听
s.accept()  被动接受TCP客户的连接,(阻塞式)等待连接的到来

客户端套接字函数
s.connect()     主动初始化TCP服务器连接
s.connect_ex()  connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

公共用途的套接字函数
s.recv()            接收TCP数据
s.send()            发送TCP数据
s.sendall()         发送TCP数据
s.recvfrom()        接收UDP数据
s.sendto()          发送UDP数据
s.getpeername()     连接到当前套接字的远端的地址
s.getsockname()     当前套接字的地址
s.getsockopt()      返回指定套接字的参数
s.setsockopt()      设置指定套接字的参数
s.close()           关闭套接字

面向锁的套接字方法
s.setblocking()     设置套接字的阻塞与非阻塞模式
s.settimeout()      设置阻塞套接字操作的超时时间
s.gettimeout()      得到阻塞套接字操作的超时时间

面向文件的套接字的函数
s.fileno()          套接字的文件描述符
s.makefile()        创建一个与该套接字相关的文件

猜你喜欢

转载自www.cnblogs.com/py8318/p/10462726.html