将目标想象成:
服务端:1.买手机(phone=...) => 2.绑定手机卡(即绑定IP地址)=> 3.开机(listen)=> 4.等待电话连接(accept)=> 5.收发消息(recv 和 send)=> 6.挂电话(close)=> 7.关机(close)
客户端:1.买手机(同上)=> 2.拨号(connect)=>3.发收消息(recv 和 send)=> 4.关闭(close)
开始实践:
一.服务端
1.买手机:我们先调用socket的这个库,然后定义一个phone并表明其基于网络通信和基于TCP协议
import socket #1.买手机 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
2.绑定手机卡:用connect()为ipone绑定ip地址 (这里的ip地址为测试地址,若输入8080告诉端口已被占用可用8081等记得服务端和客户端端口名统一)
phone.bind(('127.0.0.1',8080))
3.开机:listen()
phone.listen(5)#5为五线程
4.等待电话连接:建立个conn连接用accept() 这里在等待连接的上下各用一个print来检测是否连接成功
print('starting...')
conn,client_addr=phone.accept()
print(">>")
5.收发消息: 用while循环来实现收发信息的循环,用recv()来接受客户端发出的信息(这里的1024的单位是bytes即字节,代表最大接受1024个bytes),用print来显示用户从客户端接收过来的信息,同时我们用send()返回客户端一个用户传输过来的单词的大写
while True:#通信循环
data=conn.recv(1024)
print('客户端的数据',data)
conn.send(data.upper())
6.挂电话:用close()来剪断连接即关闭conn
conn.close()
7.关机:用close()来关闭phone
phone.close()
完整的服务端代码:
import socket
#1.买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#2.绑定手机卡
phone.bind(('127.0.0.1',8080))
#3.开机
phone.listen(5)
#4.等电话链接
print('starting...')
conn,client_addr=phone.accept()
print(">>")
#5.收发消息
while True:#通信循环
data=conn.recv(1024)
print('客户端的数据',data)
conn.send(data.upper())
#6.挂电话
conn.close()
#7.关机
phone.close()
二.客户端
1.买手机:客户端与服务端相同最开始都得“买手机”即先调用socket的这个库,然后定义一个phone并表明其基于网络通信和基于TCP协议。
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
2.拨号:通过IP地址用connect()连接服务端。
phone.connect(('127.0.0.1',8080))
3.发收消息:用while循环实现多次收发消息,input()来获取用户在客户端输入的信息,通过send()将信息传输到服务端,这里要注意因为recv()只能识别二进制语言所以我们要把信息进行编码(encode)将其变成二进制语言,之后我们再用recv()来接服务端返送回来的消息,最后将其打印出来
while True:
msg=input('>>: ').strip()
phone.send(msg.encode('utf-8'))
data=phone.recv(1024)
print(data)
4.关闭:将phone关闭结束进程
phone.close()
完整客户端代码:
import socket
#1.买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#基于网络通信基于tcp协议
#2.拨号
phone.connect(('127.0.0.1',8080))
#3.发,收消息
while True:
msg=input('>>: ').strip()
phone.send(msg.encode('utf-8'))
data=phone.recv(1024)
print(data)
#4.关闭
phone.close()
运行:
1.我们先运行服务端会得到下图结果,只print了accept上面的语句却没有print其下面的说明客户端与服务端之间的连接还没有建立,如下图所示
2.然后我们再运行客户端再回到服务端的页面可以获得下面的结果,下面的语句也print了出来说明客户端与服务端之间的连接已经建立,如下图所示
3.之后我们在客户端输入“hello”回车后在服务端可以得到客户输入的内容即hello,然后它会将客户端传输的信息通过upper()来将其全部变为大写字母之后再传输到客户端,在客户端即可获得HELLO的信息,如下图所示(左图为客户端界面,右图为服务端界面)
注:正常在客户端将用户输入的信息进行编码之后传输到服务端后服务端需要对其进行解码来读取其中的内容,但这里可能是因为全英文的缘故没有解码也能读取。



