Python实现socket简单一对一聊天

1.socket流程介绍

这里主要介绍以TCP为主的socket,即基于连接的会话,流程如图,解释如下:

  • step1 服务端需要创建一个socket对象;用bind()函数绑定一对用于连接的IP地址和端口号port;然后用listen()函数侦听打开的端口;用accept()函数接收来自客服端的请求,此时返回两个参数,一个是客户端的ip/port, 一个是客户端与服务端之间建立的连接,后续的通信都是这个连接进行的。接下来客户端就可以向服务器发起请求了。
  • step2 客户端同样需要创建一个socket对象,并用connet()方法连接服务器,传入服务器的ip/port。
  • step3 接下来客户端服务端之间就可以通过各自的socket对象,用recv()和sendall()函数发送数据了。
  • step4 通信结束以后,客户端与服务端的socket都需要进行close()操作,以关闭连接。

Python实现socket简单一对一聊天_第1张图片

2.Python代码实现

服务端

关于如何查看本地IP地址:windows: 命令行用ipconfig命令, 即可查看

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
服务端
localhost:服务端的IP地址,str型
port: 服务端开放的端口号,int型
"""

import socket

# 创建服务端socket对象
server_sk = socket.socket()

# bind()/listen()/sccept()
server_sk.bind((localhost, port))
server_sk.listen()
conn, address = server_sk.accept()

# 基于accept()函数返回的连接conn进行通信
conn.sendall(bytes("欢迎光临!\n 按q结束聊天哦!", encoding='utf-8'))
while True:
    ret = str(conn.recv(1024), encoding='utf-8')
    if ret == 'q':
        break
    else:
        conn.sendall(bytes("我已经收到:" + ret, encoding='utf-8'))
        
# 关闭连接
server_sk.close()

客户端

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
客户端
IP:服务端的IP地址,str型
port:服务端的端口号,int型
"""

import socket

# 创建socket对象
client_sk = socket.socket()

# 连接服务端
client_sk.connect((IP, port))

# 通信
print(str(client_sk.recv(1024), encoding='utf-8'))
while True:
    inp = input("请输入:")
    client_sk.sendall(bytes(inp, encoding='utf-8'))
    if inp == 'q':
        break
    else:
        print(str(client_sk.recv(1024), encoding='utf-8'))
# 关闭连接
client_sk.close()

3.注意事项

  • accept(), recv(), 这两个函数是阻塞的。
  • 对于服务端的accept(),在服务端程序运行过程中,如果没有客服端向服务器发起请求,那么accept()会一直等着,程序不会执行accept()以下的程序,直到有客户端向服务端发起请求。
  • 对于recv()函数,无论是客户端还是服务端,只要运行到recv()函数,那么如果对端没有向自己发送数据(即sendall()),那么recv()函数会一直等着,程序不会运行recv()以下的代码,直到对端向自己发送数据。因此客户端/服务端的sendall()/recv()函数是成对使用的。
  • socket在传输数据的时候是按照字节传输的,因此用sendall()函数时,需要将字符串转化为字节类型;同理,用recv()函数时,需要将字节类型的数据转化为字符串。
  • 上述代码中,recv()函数中传入的值【1024】,代表自己一次接收多少个字节的数据。

你可能感兴趣的:(网络编程)