socket是应用层于TCP/IP协议族通信的中间软件抽象层,它是一组接口。Socket组织数据,以求符合指定的协议。
基于TCP协议的Socket(基于连接的通信)
server端(服务器端)
import socket
sk = socket.socket() # 括号内默认不加参数就是进行TCP连接
sk.bind(('127.0.0.1',8898)) #把地址绑定到套接字
sk.listen() #监听链接
conn,addr = sk.accept() #接受客户端链接
ret = conn.recv(1024) #接收客户端信息
print(ret) #打印客户端信息
conn.send(ret.upper) #向客户端发送信息
conn.close() #关闭客户端套接字
sk.close() #关闭服务器套接字(可选)
client端(客户端)
import socket
sk = socket.socket() # 创建客户套接字
sk.connect(('127.0.0.1',8898)) # 尝试连接服务器
sk.send(b'hello!')
ret = sk.recv(1024) # 对话(发送/接收)
print(ret)
sk.close() # 关闭客户套接字
这样子就可以简单地建立通信了,这时候在客户端向服务端发送消息,服务端就会返回客户端消息的大写,返回到客户端,并且进行打印。
虽然这样子是建立了连接,但是这时候存在一个缺点,就是只能够一个服务端对应一个客户端,这样子是非常的不理想。这时候就需要使用到多线程或者多进程来提高效率了。
改进版
服务端
import socket
from threading import Thread
def connect(conn):
while True:
ret = conn.recv(1024) # 接收客户端信息 (二进制数据)
# print(ret.decode('utf-8').upper()) # 打印客户端信息,并且转换为大写输出(监听客户端的信息)
conn.send(ret) # 向客户端发送信息
sk = socket.socket()
sk.bind(('127.0.0.1', 8898)) # 把地址绑定到套接字
sk.listen(2) # 监听链接
while True:
conn, addr = sk.accept() # 接受客户端链接
t = Thread(target=connect, args=(conn,))
t.start()
print("接通连接")
conn.close() # 关闭客户端套接字
sk.close() # 关闭服务器套接字(可选)
客户端
import socket
sk = socket.socket() # 创建客户套接字 括号内不加参数默认就是tcp协议
sk.connect(('127.0.0.1', 8898)) # 尝试连接服务器
while True:
try:
sk.send(b'hello!') # 服务端接收到的只是二进制的数据
ret = sk.recv(1024) # 对话(发送/接收)
print(ret.decode('utf-8'))
except Exception as e:
print("fail:",e)
break
sk.close() # 关闭客户套接字
print("关闭连接")
这样子就可以实现多个客户端同时连接在一个服务器上了,这样子在应用上提高了很大的效率。
基于UDP协议的Socket(不基于连接的通信)
服务端
import socket
udp_sk = socket.socket(type=socket.SOCK_DGRAM) #创建一个服务器的套接字(UDP连接)
udp_sk.bind(('127.0.0.1',9000)) #绑定服务器套接字
msg,addr = udp_sk.recvfrom(1024)
print(msg)
udp_sk.sendto(b'hi',addr) # 对话(接收与发送)
udp_sk.close() # 关闭服务器套接字
客户端
import socket
ip_port=('127.0.0.1',9000)
udp_sk=socket.socket(type=socket.SOCK_DGRAM)
udp_sk.sendto(b'hello',ip_port)
back_msg,addr=udp_sk.recvfrom(1024)
print(back_msg.decode('utf-8'),addr)
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115137.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...