Socket-python网络编程

socket(“套接字”),用来建立通信,分为服务器端和客户端。

socket为python自带的一个模块。

一、使用(导包)

import socket

二、初始化socket对象

    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

.AF_INET (IPV4 默认)

.AF_INET6 (IPV6)

.AF_UNIX (只能够用于单一的Unix系统进程间通信)

.SOCK_STREAM   TCP (默认)

.SOCK_DGRAM          UDP

三、操作(客户端、服务器端)

客户端和服务器端的操作有点区别。主要为:服务器端是监听端口(记得开放对应的端口);客户端是根据IP和port(端口进行连接)。

实例:

服务端:

#服务端
import socket

#socket配置
serversocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host = '' #这里可以是0.0.0.0,也可以是127.0.0.1;但是本人亲测只有是空值,客户端才能连接上。
port = 11036  #端口号
serversocket.bind((host,port)) #监听,这里必须是元组的形式
serversocket.listen(5)  #设置最大连接数【具体的阻塞状态,待补充】

#进行监听连接

while True:
    clientsocket,addr = serversocket.accept() #建立连接
    print("连接地址",str(addr)) #addr为连接的客户端IP
    #接受客户端发送过来的信息【是byte类型】
    mesg = clientsocket.recv(1024)    #1024是每一次发送和接受的最大长度【待补充】
    #发送信息给客户端
    clientsocket.send("this is test".encode()) #得转成byte才能进行发送
    
    #关闭连接
    clientsocket.close()
    
    

客户端:

#客户端
import socket

#配置socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host = "" #填写所需要连接的主机的IP
port = 11036 #与服务端监听的端口要对应

s.connetc((host,port)) #连接,必须得是元组

#发送信息给服务端。服务端要对应接受的代码
s.send("this is test".encode()) #要encode转成byte类型

#接受服务器发送过来的数据
print(s.recv(1024)) 
#print(s.recv(1024).decode())  #一次接收的最大长度为1024字节,接受到的是byte类型,decode转成字符串

#关闭连接
s.close()

如果服务端需要启动服务器的程序,我们可以使用python自带的os模块

import socket
import os

serversocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    # host = socket.gethostname() #获取本地主机名
    host = ''
    port = 11036

    serversocket.bind((host,port))

    serversocket.listen(5) #设置最大连接数

    while True:
        clientsocket,addr = serversocket.accept() #建立连接
        print('连接地址',str(addr))
        #启动程序
        os.system('../run_pyrosetta_ver.sh  input.fa ./result') #默认阻塞,如果需要不阻塞,在命令前加上 start。
        #如果需要运行多条命令,用 ; 隔开即可
        print("完成")
        clientsocket.close()

通过socket传输文件

#服务端发送文件

    while True:
        clientsocket,addr = serversocket.accept() #建立连接,调用accept,socket会进入“等待”状态
        print('连接地址',str(addr))
        size = os.stat('zs.txt').st_size
        clientsocket.send(str(size).encode())
        print("文件大小为:",size)
        #以二进制的方式传输
        with open('zs.txt',mode='rb',encoding='utf-8') as f:
            msg = f.read()
            print(msg)
            if len(msg) > 450:
                for i in range(0,len(msg),450):
                    clientsocket.send(msg[i:i+450])
            else:
                clientsocket.send(msg)
#客户端接受文件

num = 0
ftext = b''
msg = s.recv(1024)
print('文件大小->',int(msg))
while int(msg)>num:
    if int(msg) - num >1024:
        size = 1024
    else:
        size = int(msg) - num
        text = s.recv(size)
        num += len(text)
        print(text)
        ftext += text
#以二进制的方式写文件
with open("test.txt","wb") as f:
     f.write(ftext)
     f.close()

最后,如果网页需要长连接,例如聊天,直播间等等场景,我们可以用到websocket,flask中也可以使用socket建立通信。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值