0
点赞
收藏
分享

微信扫一扫

python-socket编程

c一段旅程c 2022-05-06 阅读 106

一、基本原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VR2NRMxx-1651769489090)(images/python的socket编程/1762677-20201007160746044-1258982359.png)]

1、创建socket对象

s = socket.socket([family[, type[, proto]]])

参数类型:

  • family: 套接字家族,可以使AF_UNIX或者AF_INET
  • type: 套接字类型,根据是面向连接的还是非连接分为SOCK_STREAMSOCK_DGRAM,也就是TCP和UDP的区别。
  • protocol: 一般不填默认为0。

2、socket对象操作方法

  • 服务端
s.bind(host, port)   #绑定主机和端口号   连接远程vps,ip地址为vps的ip,通过ifconfig查看
s.listen([backlog])			#启动一个服务,并进行监听, backlog参数可选,指定系统最大的连接数,超过这个数,程序将拒绝连接
s.accept()   #接受一个连接,返回值是一个元组(conn, address), conn是一个新的socket对象,address是连接这个socket进程绑定的地址
  • 客户端
ip_port = (ip, port)   #要连接的主机的ip地址和端口号,注意数据是元组
s.connect(ip_port)     #connect函数实现连接到  远程套接字
s.connect_ex()         #相比于connect函数,这个函数不会抛出异常,而是返回一个错误码(errno)
  • 通用的方法
#通过socket传输的数据都是二进制(bytes)类型,也就是说需要 encode()  decode()操作

s.recv(bufsize)    	#接受数据函数,bufsize指定一次接受的数据大小

#下面两个方法要求已经建立socket连接
s.send()    		#发送数据(经过encode), 返回值是发送数据的大小
s.sendall()       	#成功返回None, 发送失败抛出一个异常  

s.sendto(bytes, address)  #address指定目的套接字

二、使用socket实例

1、服务端与客户端进行通信

实现功能:本机远程主机进行的通信

注意:server端绑定的是vps主机的ip地址,client端连接的是vps的公网地址

server.py 服务端

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#s.create_server(('', 8888))  #create_server创建的是一个socket对象

ip_port =(('10.0.16.16', 7777))   #这里的ip地址为vps的地址,而不是公网地址

s.bind(ip_port)

s.listen()

print("-----start socket server, waiting for connet-----")

conn, address = s.accept()

while True:
    client_data = conn.recv(1024).decode()
    if client_data == "exit":
        exit("connection close")
    print(f"recv from {address} data is :{client_data}")
    conn.sendall("the server has received message".encode())

conn.close()

client.py 客户端

import socket

s = socket.socket()

s.connect(("124.222.170.241", 7777))  #这个地方的地址需要是公网ip,这样才能找到这台主机

while True:

    inp = input("plz input something you need to translate:").strip()

    s.sendall(inp.encode())

    if inp == "exit":
        print("close connection")
        break

    response = s.recv(1024).decode()
    print(response)

s.close()

举报

相关推荐

0 条评论