1.socket起源和介绍(如果了解直接跳过)

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)
        基本上,Socket 是任何一种计算机网络通讯中最基础的内容。例如当你在浏览器地址栏中输入 http://www.baidu.com 时,你会打开一个套接字,然后连接到 http://www.baidu.com
        并读取响应的页面然后然后显示出来。而其他一些聊天客户端如 gtalk 和 skype 也是类似。任何网络通讯都是通过 Socket 来完成的

Python 的 socket 模块提供了使用 Berkeley sockets API 的接口。

主要的用到的 Socket API 函数和方法有下面这些:(重点)

bind() 绑定地址 (host,port) 到套接字,例子:bind((ip,port)),括号中在嵌套一对括号里面是元组

listen() 开始tcp监听。操作系统可以挂起的最大连接数量

accpet() 被动接受tcp客户端连接,(阻塞式)等待连接的到来

connect() 主动初始化tcp服务器连接

recv() 接受tcp数据,类型为bytes

send() 发送tcp数据,类型为bytes

close() 关闭套接字,端口连接

下面是服务端和客户端源代码:

2.tcp-server(服务端源代码)

AF_INET 表示 IPV4协议,SOCK_STREAM 表示 TCP协议

# 开发时间: 2023/5/23 22:03
import socket
# 版权声明
print('版权归原作者zzx所有!!!')

# 创建socket会话对象
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 建立连接
print('提示:如果是本机的话直接输入127.0.0.1,即可!')
tcp_server_ip = input('请输入服务端的ip地址:')
print('服务端ip地址是:', tcp_server_ip)
tcp_server_port = 8881
print('服务端开放的端口是:', tcp_server_port)
tcp_server.bind((tcp_server_ip, tcp_server_port))

# 设置监听为5
tcp_server.listen(5)
print('等待客户端过来连接...')

# 阻塞连接

info, addr = tcp_server.accept()


# 主程序
def main():
    while True:
        data = info.recv(1024)  # 接受数据
        # 如果返回空bytes,表示对方关闭了连接,直接退出
        if not data:
            print('客户端已经断开连接,服务端关闭!')
            break
        print('收到客户端信息:', data.decode('utf-8'))
        send_data = input('请返回信息给客户端:')
        print('等待客户端回消息!')
        info.send(send_data.encode('utf-8'))


if __name__ == '__main__':
    main()
    # pass

3.tcp-client(客户端源代码)

# 开发时间: 2023/5/23 22:03
import socket

# 版权声明
print('版权归原作者zzx所有!!!')

# 创建socket会话对象
tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_client_ip = input('请输入需要连接服务端的ip地址:')
print('当前连接服务端ip地址是:', tcp_client_ip)
tcp_client_port = 8881
print('连接上的服务端的端口是:', tcp_client_port)
tcp_client.connect((tcp_client_ip, tcp_client_port))


def main():
    while True:
        data = input('请输入发送信息给服务端:')
        if data == 'exit':
            print('客户端断开连接')
            break
        print('等待服务端端发送消息!')
        tcp_client.send(data.encode('utf-8'))  # 编码发送
        back_info = tcp_client.recv(1024).decode('utf-8')
        print('收到服务端返回的信息:', back_info)


if __name__ == '__main__':
    main()
    # pass