参考: http://www.cnblogs.com/alex3714/articles/5830365.html
Socket
- A network socket is an endpoint of a connection across a computer network. Today, most communication between computers is based on the Internet Protocol; therefore most network sockets are Internet sockets. More precisely, a socket is a handle (abstract reference) that a local program can pass to the networking application programming interface (API) to use the connection, for example "send this data on this socket".
- 实现步骤 (伪代码:)
-
Socket socket = getSocket(type = "TCP") #设定好协议类型 connect(socket, address = "1.2.3.4", port = "80") #连接远程机器 send(socket, "Hello, world!") #发送消息 close(socket) #关闭连接
简单Socket 实例
1. 客户端
#!/usr/bin/python # -*- coding: utf-8 -*- # 客户端 import socket client = socket.socket() # 声明socket类型, 同时生成socket链接对象 client.connect(('localhost', 6969)) client.send(b"Hellow World") # 只能接收字节类型, 所以要加b转一下 data = client.recv(1024) # 收1024个字节 print("recv: ", data) client.close()
2. 服务端
#!/usr/bin/python # -*- coding: utf-8 -*- """ 要实现对话: 1. 需要用多线程, 服务器端和客户端交叉执行才能完成一个对话; 2. 用异步也可以实现 3. 最简单的, 哪个实例发过来的, 就用哪个实例接收(在代码执行窗口手动切换 client端和服务端). """ # 服务器端 import socket server = socket.socket() # 不传入参数就是使用构造方法的默认参数设置 server.bind(('localhost', 6969)) # 绑定要监听的端口 server.listen() # 监听 print("我要开始等电话了") conn, addr = server.accept() # 等电话打进来. server.accept()返回两个值,分别赋给conn, addr. # conn就是客户端连过来而在服务器端为其生成的一个连接实例 print(conn, addr) print("电话来了") # data = server.recv(1024) # 开始接收对方发过来的信息 data = conn.recv(1024) # 谁打来的电话, 跟谁聊 print("recv: ", data) # server.send(data.upper()) conn.send(data.upper()) server.close()
实现效果:
挂起多个客户端实例.
客户端:
#!/usr/bin/python # -*- coding: utf-8 -*- """ 重复发送和接收多次: 1. 实现用户输入 """ import socket client = socket.socket() # 声明socket类型, 同时生成socket连接对象 client.connect('localhost', 6969) while True: msg = input(">>: ").strip() if len(msg) == 0: continue # 不能发空的. 否则系统以为用户还在输入, 会一直等. client.send(msg.encode("utf-8")) data = client.recv(1024) print("recv: ", data.decode()) # 把utf-8转成unicode client.close()
服务器端:
#!/usr/bin/python # -*- coding: utf-8 -*- """ 下面这段在linux执行时, 如果client端断开, server端会陷入死循环. 在window里, 如果client端断开, server端也会断开. 要克服上述问题, 要加个判断, 如果接收的信息是空, 断开循环. (见第二段代码) """ # 服务器端 import socket server = socket.socket() # 不传入参数就是使用构造方法的默认参数设置 server.bind(('localhost', 6969)) # 绑定要监听的端口 server.listen() # 监听 print("我要开始等电话了") conn, addr = server.accept() # 等电话打进来. server.accept()返回两个值,分别赋给conn, addr. # conn就是客户端连过来而在服务器端为其生成的一个连接实例 print(conn, addr) print("电话来了") # data = server.recv(1024) # 开始接收对方发过来的信息 data = conn.recv(1024) # 谁打来的电话, 跟谁聊 print("recv: ", data) # server.send(data.upper()) conn.send(data.upper()) server.close() """ 上面这段代码实现的是如果client端断开, server端也随之断开. 但是server应该还能接收新的电话进来 . 所以要加循环. """ # import os import socket server = socket.socket() # 不传入参数就是使用构造方法的默认参数设置 server.bind(('localhost', 6969)) # 绑定要监听的端口 server.listen() # 监听. server.listen(5)代表最多能挂起5个client端(不断开, 排队), 但这种情况要在异步情形下才能测出来. print("我要开始等电话了") while True: #即使当前client端断开, 还可以等新的电话 conn, addr = server.accept() # 等电话打进来. server.accept()返回两个值,分别赋给conn, addr. # conn就是客户端连过来而在服务器端为其生成的一个连接实例 print(conn, addr) print("电话来了") while True: # data = server.recv(1024) # 开始接收对方发过来的信息 data = conn.recv(1024) # 谁打来的电话, 跟谁聊. 一次最多收10240字节. print("recv: ", data) if not data: print("client has lost...") break # 切断循环 res = os.popen(data).read() # 打印执行结果 # server.send(data.upper()) # conn.send(data.upper()) conn.send(res) server.close()