如何使用socket进行网络通讯
socket
UDP
# -*- coding: utf-8 -*-
import socket
from datetime import datetime
# server
server_address = ("localhost", 6789)
max_size = 4096
print("Starting the server at", datetime.now())
print("Waiting for a client to call.")
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(server_address)
data, client = server.recvfrom(max_size)
print("At", datetime.now(), client, "said", data)
server.sendto(b"Are you talking to me?",client)
server.close()
# -*- coding: utf-8 -*-
import socket
from datetime import datetime
# client
server_address = ("localhost", 6789)
max_size = 4096
print("Starting the client at", datetime.now())
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.sendto(b"Hey!", server_address)
data, server = client.recvfrom(max_size)
print ("At", datetime.now(), server, "said", data)
client.close()
TCP
# -*- coding: utf-8 -*-
import socket
from datetime import datetime
# server
server_address = ("localhost", 6789)
max_size = 1000
print("Starting the server at", datetime.now())
print("Waiting for a client to call.")
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(server_address)
server.listen(5)
client, addr = server.accept()
data = client.recv(max_size)
print("At", datetime.now(), client, "said", data)
client.sendall(b"Are you talking to me?")
client.close()
server.close()
# -*- coding: utf-8 -*-
import socket
from datetime import datetime
# client
server_address = ("localhost", 6789)
max_size = 1000
print("Starting the client at", datetime.now())
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(server_address)
client.sendall(b"Hey!")
data= client.recv(max_size)
print ("At", datetime.now(), "someone replied", data)
client.close()
ZeroMQ
Server
# -*- coding:utf-8 -*-
import zmq
# server
host = "127.0.0.1"
port = 6789
context = zmq.Context()
server = context.socket(zmq.REP)
server.connect("tcp://%s:%s"%(host, port))
while True:
request_bytes = server.recv()
request_str = request_str.encode("utf-8")
print ("That voice in my head says: %s"%request_str)
reply_str = "Stop saying: %s" %request_str
reply_bytes = bytes(reply_str, "utf-8")
server.send(reply_bytes)
Client
# -*- coding:utf-8 -*-
import zmq
# client
host = "127.0.0.1"
port = 6789
context = zmq.Context()
client = context.socket(zmq.REQ)
client.connect("tcp://%s:%s"%(host, port))
for num in range(1, 6):
request_str = "message #%s" %num
request_bytes = request_str.encode("utf-8")
client.send(request_bytes)
reply_bytes = client.recv()
reply_str = reply_bytes.decode("utf-8")
print ("Send %s, received %s" %(request_str, reply_str))
ActiveMQ
RabbitMQ
什么是socket
socket(套接字)源于Unix操作系统,编码异常繁琐。
套接字通讯程序编写过程中面临的问题:
* UDP 发送大小受限的消息
* TCP 发送字节流;TCP 需要添加额外的字符形成消息