基于socket网络编程的hello网络聊天小程序的python实现

1、基本概念

1.1socket套接字

可以简单的把套接字理解为一个网络地址和端口的组合,它是基于tcp/ip协议,操作系统提供的一种系统调用,用作进程间通信,主要是是不同主机之间的进程通信。因为有了套接字,所以一般网络程序员不需要直接和tcp/ip打交道,主流的操作系统一般都提供了相应的API调用。比如,使用socket,你可以绑定相应的网络IP以及端口号,可以选择使用tcp或者是使用udp。

1.2tcp和udp

TCP协议则是建立在IP协议之上的。TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP协议会通过握手建立连接,然后,对每个IP包编号,确保对方按顺序收到,如果包丢掉了,就自动重发。许多常用的更高级的协议都是建立在TCP协议基础上的,比如用于浏览器的HTTP协议、发送邮件的SMTP协议等。

使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,能不能到达就不知道了。虽然用UDP传输数据不可靠,但它的优点是和TCP比,速度快,对于不要求可靠到达的数据,就可以使用UDP协议。

1.3客户端和服务器

创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。举个例子,当我们在浏览器中访问新浪时,我们自己的计算机就是客户端,浏览器会主动向新浪的服务器发起连接。如果一切顺利,新浪的服务器接受了我们的连接,一个TCP连接就建立起来的,后面的通信就是发送网页内容了。

1.4原理图

2、基于python的hi简单聊天程序

2.1服务器程序

import socket

sk = socket.socket() # 默认是AF_INET、SOCK_STREAM
address = ('127.0.0.1', 12345) 
sk.bind(address) # 将主机号与端口绑定到套接字
sk.listen(3) # 设置并启动TCP监听器
print('waitting...')
while True:
    conn, addr = sk.accept() # 被动接受TCP连接,一直等待连接到达
    print('连接到达',addr)
    while True:
        data = conn.recv(1024) # 接收TCP消息,并制定最大长度
        if not data:
            print('连接已断开!')
            conn.close()
            break
        print(str(data, 'utf8'))
        inp = input('>>')
        conn.send(bytes(inp, 'utf8'))  #向客户端回送信息

注意这里使用的是tcp,SOCK_STREAM代表的是tcp协议

2.2客户端程序

import  socket

sk = socket.socket() # 默认是AF_INET、SOCK_STREAM
address = ('127.0.0.1', 12345)
sk.connect(address) #连接服务端
while True:
    inp = input('>>')
    if inp == 'exit':
        break
    sk.send(bytes(inp, 'utf8')) #向服务端发送信息
    data = sk.recv(1024)
    print(str(data, 'utf8'))
else:
    sk.close()

运行结果:

3、使用strace追踪程序代码的api调用

strace python3 server.py

运行结果:

猜你喜欢

转载自www.cnblogs.com/ethan123/p/12008818.html