网络基础: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()

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

 

猜你喜欢

转载自www.cnblogs.com/aizhinong/p/11517593.html
今日推荐