代码改变世界

Python Socket 通信

2018-06-27 08:05  钱先生  阅读(250)  评论(0编辑  收藏  举报

参考: http://www.cnblogs.com/alex3714/articles/5830365.html

Socket

  • 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()
client端

服务器端:

#!/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()
server端