socket编程python

socket参数

family地址簇

socket.AF_INET IPv4 (默认)

socket.AF_INET6 IPv6

socket.AF_UNIX 只能用于单一的unix系统进程间通信

type类型

socket.SOCK_STREAM  流式socket,for TCP(默认)

socket.SOCK_DGRAM  数据报式socket, for UDP

socket.SOCK_RAW   原始套接字

socket.SOCK_RDM   可靠UDP形式

socket.SOCK_SEQPACKET  可靠的连续数据包服务

proto: 协议号

 0:默认。可以省略

CAN_RAW或CAN_BCM: 地址族为AF_CAN

 

下面是基础的TCP链接的  server  client

#tcp_server
import socket
import random
sk=socket.socket()
#定义绑定ip和端口
ip_port=("127.0.0.1",8888)
#绑定链接
sk.bind(ip_port)
#最大连接数
sk.listen(5)
while True:
    #提示信息
    print("正在等待接受数据哦")
    #接受数据(传回连接对象和地址)
    conn,address=sk.accept()
    #定义信息3.6版本都是byte类型,str都需要编码
    msg="连接成功"
    #返回信息
    conn.send(msg.encode())
    #不断接受客户端发来的消息
    while True:
        #接受客户端消息
        data = conn.recv(1024)
        #打印
        print(data.decode())
        #接受到退出指令
        if data== b'exit':
            break
        #处理客户端信息
        conn.send(data)
        #发送随机数信息
        conn.send(str(random.randint(1,1000)).encode())
    #主动关闭链接
    conn.close()

#tcp_client

import socket
client=socket.socket()
#定义绑定ip和端口
ip_port=("127.0.0.1",8888)
#连接服务器
client.connect(ip_port)

while True:
    # 接受主机信息1024个字节
    data = client.recv(1024)
    # 打印接受的数据byte型解码
    print(data.decode())
    # 定义一个不断发送消息的循环
    msg_input= input("输入需要发送的消息:")
    #消息发送
    client.send(msg_input.encode())
    if msg_input =='exit':
        break
    data = client.recv(1024)
    print(data.decode())

 

#UDPserver

import socket

sk=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
ip_port=("127.0.0.1",8888)
sk.bind(ip_port)
while True:
    #接受数据
    data = sk.recv(1024)
    #打印数据
    print(data.decode())

#UDP_client

import socket
#UDP可以打开多个客户端进行发送消息,因为不是可靠连接
#ipv4 UDP
sk=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

ip_port=("127.0.0.1",8888)
while True:
    msg_input = input("输入你要的消息")
    if msg_input== "exit":
        break
    #数据发送
    sk.sendto(msg_input.encode(),ip_port)
#发送关闭信息
sk.close()

 

socket的非阻塞

 

import socketserver
import random #为了发送随机数信息
#定义一个类
class  MyServer(socketserver.BaseRequestHandler):
    #按照顺序执行 setup -> handler -> finish
    #handler方法报错,会跳过,其他两个无论如何都会执行
    def setup(self):
        pass

    def handle(self):
        #定义连接变量
        conn = self.request
        #发送消息定义
        msg="Hello World!"
        #消息发送
        conn.send(msg.encode())
        #进入循环不断接受客户端消息
        while True:
            #接受客户端消息
            data =  conn.recv(1024)
            #打印
            print(data.decode())
            if data == b'exit':
                break
            conn.send(data)
            conn.send(str(random.randint(1,1000)).encode())
        conn.close()
    def finish(self):
        pass

if __name__ == "__main__":
    #创建你多线程实例 输入地址端口,多线程定义类
    server = socketserver.ThreadingTCPServer(
        ("127.0.0.1",8888), MyServer)
    #开启异步多线程,等待客户端连接
    server.serve_forever()

客户端仍然用之前的client即可

 

下面写一个文件发送与接收的程序

#接收服务器
import socket

sk = socket.socket()
ip_port = ("127.0.0.1", 9999)
# 绑定端口和最大连接数
sk.bind(ip_port)
sk.listen(5)
while True:
    # 等待客户端连接
    conn, address = sk.accept()
    # 一直使用当前连接进行数据发送直到结束标志出现
    while True:
        # 打开文件等待写入
        with open("file", 'ab') as f:
            # 接受数据
            data = conn.recv(1024)
            if data == b'quit':
                break
            # 写入文件
            f.write(data)
        # 接受完成标志
        conn.send('success'.encode())
    # 打印关闭提示信息
    print("上传成功")
sk.close()

 

#发送方

import socket

sk = socket.socket()
ip_port = ("127.0.0.1", 9999)
sk.connect(ip_port)
with open('socket_server_tcp2.py', 'rb') as f:
    # 按每一段分割文件
    for i in f:
        # 数据上传
        sk.send(i)
        # 等待接收完成
        data = sk.recv(1024)
        # 判断服务器是否接受成功
        if data != b'success':
            break
# 给服务器端发送结束信号
sk.send('quit'.encode())

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值