网络基础:socket模块

Posted aizhinong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络基础:socket模块相关的知识,希望对你有一定的参考价值。

socket:

  套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。

基于TCP协议的socket:tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端

server服务端:

#server服务端
import socket
sk = socket.socket() #创建服务套接字
sk.bind((127.0.0.1,8080))  #把地址绑定到套接字
sk.listen()             #建立监听链接,能否建立需要accept函数去进行检查
conn,addr = sk.accept() #接收客户端链接,接收值分别为客户端套接字对象与地址信息
ret = conn.recv(1024).decode(utf-8)   #接收客户端消息
print(ret)              #打印客户端消息
conn.send(bytes(你好,encoding=utf-8)) #用接收到的客户端套接字给客户端发送消息
conn.close()            #关闭客户端套接字
sk.close()              #关闭服务器套接字(可选)

client用户端:

import socket
sk = socket.socket()            #创建客户套接字
sk.connect((127.0.0.1,8080))  #尝试连接服务器
sk.send(bytes(很高兴认识你,encoding=utf-8)) #发送消息
ret = sk.recv(1024).decode(utf-8)     #接收消息
print(ret)                      #打印消息
sk.close()                      #关闭客户套接字

注意:服务端的accept接收客户端的连接请求,返回一个新的用户端套接字对象,和一个地址信息,新的用户端套接字用于接收或者传输消息。服务端用bind绑定地址到套接字,而用户端用connect连接服务器。

 

测试1:

#假装在聊天
#server:
import socket
sk = socket.socket()
sk.bind((127.0.0.1,8081))
sk.listen()
conn,addr = sk.accept()
while True:
    ret = conn.recv(1024).decode(utf-8)
    print(ret)
    if ret == cool:bye:
        conn.send(bytes(柚柚柚切克闹:bye,encoding=utf-8))
        break
    info = input(柚柚柚切克闹:)
    conn.send(bytes(柚柚柚切克闹:%s%(info),encoding=utf-8))
conn.close()
sk.close()


#client:
import socket
sk = socket.socket()
sk.connect((127.0.0.1,8081))
while True:
    chat = input(cool:)
    sk.send(bytes(cool:%s%(chat),encoding=utf-8))
    ret = sk.recv(1024).decode(utf-8)
    print(ret)
    if ret == 柚柚柚切克闹:bye:
        sk.send(bytes(cool:bye,encoding=utf-8))
        break

sk.close()

测试2:

  每隔十秒用户端向服务端发送一个时间戳,服务端接收后给用户端返回一个格式化的时间

#server:
import socket,time
sk = socket.socket()
sk.bind((127.0.0.1,8081))
sk.listen()
conn,addr = sk.accept()
while True:
    ret = conn.recv(1024).decode(utf-8)
    print(ret)
    info_ret = time.strftime(%Y-%m-%d %H:%M:%S, time.localtime(int(ret))) #需要把字符串强转为整型
    conn.send(bytes(str(info_ret),encoding=utf-8))
conn.close()
sk.close()

#client
import socket,time
sk = socket.socket()
sk.connect((127.0.0.1,8081))
while True:
    time.sleep(10)
    timer = int(time.time()) #时间戳返回值为float,需要转换成整型
    sk.send(bytes(str(timer),encoding=utf-8))#只能传bytes类型,而消息的传输都是以字符串的形式
    ret = sk.recv(1024).decode(utf-8)
    print(ret)

sk.close()

 注意:消息的传输都是字符串形式,需要注意数据类型之间的转换

 

以上是关于网络基础:socket模块的主要内容,如果未能解决你的问题,请参考以下文章

socket网络编程基础模块

Python 之 socket网络模块简单应用

python基础===socket模块的讲解(转)

网络编程(part11)--socket模块方法及socket套接字属性

python网络设计模块

网络编程基础:网络基础之网络协议socket模块