网络编程2.0-----通讯(TCP协议实现服务器和客户端)

目录

前言:

 Socket编程

1.简介

2. Python中的socket

 服务器的实现

用户端的实现


前言:

        上一期我们初步学习了解了网络通讯的概念(链接网络编程1.0-----网络与通信介绍_灰勒塔德的博客-CSDN博客),那么这一期我们就接着学习通过网络编程来实现服务器和客户端之间的信息传送。

 Socket编程

1.简介

        socket编程一种独立于协议的网络编程接口,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

2. Python中的socket

在Python当中已有一个socket封装好的模块,当我们想通过Python去实现socket编程的时候,只需要把这个模块导入就行了,然后按照里面的方法就可以去搭建一个局域网的服务器和用户端。

导入模块

import socket

 服务器的实现

        每次当我们在微信、QQ上发送一条信息的时候,我们发送的信息会通过局域网然后传递到公网上,再传入到绑定公网的服务器当中,然后服务器再通过网络协议往下传给接收者。网络通讯大概就是这么一个过程,那这里我通过tcp协议来去实现局域网直接的服务器的代码

import random
import socket
#1.创建服务器对象
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 参数1:socket.AF_INET, 表示 ipv4地址
# 参数2:socket.SOCK_STREAM表示 tcp协议封装好的参数

#2.获取当前计算机地址的代码
p=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
p.connect(('8.8.8.8',80))
nowip=p.getsockname()[0]
p.close()

port=8888
print('当前的ip地址:',nowip)
print('当前端口号:',port)
#3.把服务器绑定到本计算机上
server.bind((nowip,port))

#4.设置监听模式,设置最大的监听数
server.listen(128) #设置最大的连接数128
print('服务端已启动,等待连接……')


#5.等待客户的连接
conn, addr = server.accept()
# conn 是连接客户端的套接字对象
# addr 是表示客户端的连接地址

while 1:
    try:
        #6.接受客户端的数据
        #网络数据都是以字节流的形式去发送的
        data=conn.recv(1024).decode('utf8') #参数1024表示每次接受最大的字节数,decode进行解码,由字节流编码转换为字符
        if not data:#当接受到空数据的时候就说明客户端断开了连接
            print(f'{addr}断开了连接')
            break
        print(f'----{addr}发送了----',data)
        #7.返回一个0~100的随机数数据给客户端
        conn.send(str(random.randint(0,100)).encode('utf8'))#进行字节流编码发送

    except ConnectionResetError:
        print('error')
        break

#7.关闭套接字对象
conn.close()

#8.关闭服务器
server.close()

用户端的实现

客户端的代码实现也是跟服务器差不多的,实现要先去创建一个客户端对象,然后连接到服务器的地址以及端口号,然后就可以去实现与服务器进行信息发送与接受了。代码如下:

#客户端
import socket
#1.创建客户端对象
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#2.连接服务器地址和端口
client.connect(('10.33.110.204',8888))

count=1 #计数
while 1:
    a=input(r'输入你要发送的内容(\q退出):').strip()
    if a==r'\q':
        break
    if not a: #当发送的数据为空时就重新输入
        print('发送的数据不能为空')
        continue
    #3.把数据发送给服务器    
    client.send(a.encode('utf8'))
    #4.获取到服务器发送的数据
    data = client.recv(1024)  # receive
    if not data:
        break
    print(f'对方发送的消息--{count}--:',data.decode("utf8"))
    count+=1
    
#5.关闭客户端
client.close()

(注意:以上的代码功能是在局域网内才能实现服务器和客户端之间的信息发送与接受,如果两台设备连接不同的WiFi的话那就发送不了信息了)

 好了以上就是本期的全部内容了,我们下一期再见!

分享一张壁纸:

(薇尔莉特.伊芙加登) 

猜你喜欢

转载自blog.csdn.net/m0_73633088/article/details/129843370