每种语言的后端底层都是基于socket编程,Python里面的大概是这样的方式:
服务器端:server.py
import socket
def handle_request(client):
buf = client.recv(1024)
print buf
client.send("Hello World!")
def main():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("localhost", 9000))
sock.listen(10)
while True:
connect, address = sock.accept()
handle_request(connect)
connect.close()
if __name__ == "__main__":
main()
客户端:client.py
import socket
def client():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 9000))
sock.send("I am client")
data = sock.recv(1024)
if __name__ == "__main__":
client()
服务器端:
1.创建套接字,绑定套接字到本地IP与端口
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("localhost", 9000))
2.开始监听连接
s.listen(5)
3.进入循环,不断接受客户端的请求
s.accept()
4.接收传来的数据,处理并给对方发送数据
buf = s.recv(1024)
s.send("Hello")
5.传输完成,关闭连接
s.close()
客户端:
1.创建套接字,连接远端地址
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("localhost", 9000))
2.连接后发送数据并接收数据
s.send("Hello")
buf = s.recv(1024)
3.传输完毕后,关闭套接字
s.close()
select模块中有select,poll,epoll三种方式实现socket编程,他们都是Linux上实现的是IO多路复用技术,可以同时监听多个套接字。
select:
IO多路复用 :
通过一种机制,可以监视多个描述符(socket),一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
Linux中的 select,poll,epoll 都是IO多路复用的机制
Linux下网络I/O使用socket套接字来通信,普通I/O模型只能监听一个socket,而I/O多路复用可同时监听多个socket.
I/O多路复用避免阻塞在io上,原本为多进程或多线程来接收多个连接的消息变为单进程或单线程保存多个socket的状态后轮询处理.