生活不易 我用pythonPython自学与资料分享程序员

Python3.6:socket实现简单传输数据

2018-02-09  本文已影响14人  james_chang

客户端:

import socket

flag = True

# 生成socket对象
client = socket.socket()

# 链接要链接的ip和port(端口)
client.connect(('localhost', 6666))

# while循环
while flag:

    # 获得用户输入
    msg = input("Enter your message('q' for quit):").strip()

    # 判断是否为空
    if len(msg) == 0:
        print("Message can't be empty")
        continue

    # 发送数据
    client.send(msg.encode())

    # 判断是否为'q'
    if msg != 'q':

        # 接收数据
        data = client.recv(1024)

        # 打印接收到的数据
        print(data)

    else:
        # 条件为False
        flag = False

# 关闭socket链接
client.close()
print('Server Closed')

服务器端:

import socket

flag = True

# 生成socket对象
server = socket.socket()

# 绑定ip和端口
server.bind(('localhost', 6666))

# 监听绑定的端口
server.listen()

# 方便识别打印一个我在等待
print("I'm waiting the connect...")


# 这里用两个值接受,因为链接上之后使用的是客户端发来请求的这个实例
# 所以下面的传输要使用conn实例操作
conn, addr = server.accept()

# 打印链接成功
print('Connect success!')

# 进入循环
while flag:

    # 接受数据并赋给data
    data = conn.recv(1024).decode()

    # 判断
    if data != 'q':

        # 打印收到数据
        print('收到:', data)

        # 发送我收到数据了
        conn.send('Send Successed!'.encode())

    else:

        # 条件为False
        flag = False

# 关闭socket链接
server.close()

先运行服务器端,后运行客户端:



需要注意的几个点:

编码问题,因为只支持bytes类型数据,每次发送之前要encode()一下,接收之后要decode()一下

服务器端的while判断要放在accept()之后,也就是说不能将accept()放在循环中,如果包进循环中,只能传输一次就会卡住,第二次循环就会再等待连接

不能send空,如果为空的话服务器端recv会一直等待,也就是说客户端什么都不输入直接回车就会卡住,可以通过判断避免这种情况

这里呢是客户端断开服务器端也会断开,这里是我自己写的断开,即使不写,客户端断开服务器端也会断开,可以在accept上再添加一个循环,修改一下服务器端就可以了

import socket

flag = True

# 生成socket对象
server = socket.socket()

# 绑定ip和端口
server.bind(('localhost', 6666))

# 监听绑定的端口
server.listen()

while flag:

    # 方便识别打印一个我在等待
    print("I'm waiting the connect...")

    # 这里用两个值接受,因为链接上之后使用的是客户端发来请求的这个实例
    # 所以下面的传输要使用conn实例操作
    conn, addr = server.accept()

    # 打印链接成功
    print('Connect success!')

    # 进入循环
    while flag:

        # 接受数据并赋给data
        data = conn.recv(1024).decode()

        # 判断
        if data != 'q':

            # 打印收到数据
            print('收到:', data)

            # 发送我收到数据了
            conn.send('Send Successed!'.encode())

        else:
            print('This connection is broken')
            break

# 关闭socket链接
server.close()

这样就实现了客户端断开服务器端不会断开,服务器一直等待客户端连接

转载请注明出处

python自学技术互助扣扣群:670402334

下一篇:socket实现简单ssh客户端

上一篇 下一篇

猜你喜欢

热点阅读