C/S架构: Client/Server(客户端与服务器端架构)
B/S架构: Browser/Server(浏览器端与服务器端架构)
无论是C/S或B/S架构,只要进行网络通信,基本都要用socket
事例1
1 服务端
2 # 导入socket模块
3 import socket
4
5 # 创建服务端程序socket对象
6 server = socket.socket()
7
8 # 给服务端程序设置一个本机IP地址和本机端口号
9 ip_port = ('192.168.12.42',8002)
10
11 # 配置本机的IP地址与本机的端口号绑定
12 server.bind(ip_port)
13
14 # 监听本机的地址和端口(等待请求)
15 server.listen()
16
17 # 等待建立连接,conn是连接通道,addr是客户端的地址
18 conn,addr = server.accept()
19
20 # 服务端通过conn连接通道来收发消息,通过recv方法,recv里面的参数是字节(B)
21 from_client_msg = conn.recv(1024)
22
23 # 打印传递过来的的消息(因为默认接收到的是字节,所以打印的也是字节)
24 print(from_client_msg)
25
26 # 关闭通道
27 conn.close()
28 # 关闭socket对象
29 server.close()
30 服务端打印结果
31 b'hello'
32
33
34 客户端
35 # 导入socket模块
36 import socket
37
38 # 创建客户端程序socket对象
39 client = socket.socket()
40
41 # 配置要发数据的服务端IP和端口
42 server_ip_port = ('192.168.12.42',8002)
43
44 # 连接服务端的应用程序,通过connect方法,参数是服务端的ip地址和端口
45 client.connect(server_ip_port)
46
47 # 发消息,用的send方法,但是调用者是client的socket对象(默认发送的是字节)
48 client.send(b'hello')
49
50 # 关闭socket对象
51 client.close()
事例2
1 服务端
2 import socket
3 server = socket.socket()
4 ip_port = ('192.168.12.42',8002)
5 server.bind(ip_port)
6 server.listen()
7 conn,addr = server.accept()
8 from_client_msg = conn.recv(1024)
9 # 打印客户端发过来的消息
10 print('刘力说:',from_client_msg.decode('utf-8'))
11
12 #回复消息:通过send方法,参数必须是字节类型的(发给客户端的消息)
13 conn.send('你猜我猜不猜'.encode('utf-8'))
14 conn.close()
15 server.close()
16
17
18 客户端
19 import socket
20 client = socket.socket()
21 server_ip_port = ('192.168.12.42',8002)
22 client.connect(server_ip_port)
23
24 # 可以通俗的理解这就是发送给服务器端的消息
25 client.send('猜猜我是谁'.encode('utf-8'))
26
27 # 可以通俗的理解这就是接收服务器端返回给客服端的消息
28 from_server_msg = client.recv(1024)
29 print('王萌说:',from_server_msg.decode('utf-8'))
30 client.close()
事例3
1 服务端
2 import socket
3 server = socket.socket()
4 ip_port = ('192.168.12.42', 8002)
5 server.bind(ip_port)
6 server.listen()
7 conn,addr = server.accept()
8 while 1:
9 from_client_msg = conn.recv(1024)
10
11 # 打印客户端发送过来的消息
12 print('刘力说:',from_client_msg.decode('utf-8'))
13
14 # 判断如果客户端输入的是bye就退出
15 if from_client_msg.decode('utf-8') == 'bye':
16 break
17
18 # 给客户端发送的的消息
19 to_clinet_msg = input('王萌说:')
20 conn.send(to_clinet_msg.encode('utf-8'))
21
22 # 判断如果服务器端输入的是bye就退出
23 if to_clinet_msg.upper() == 'bye':
24 break
25 conn.close()
26 server.close()
27
28
29 客户端
30 import socket
31 client = socket.socket()
32 server_ip_port = ('192.168.12.42', 8002)
33 client.connect(server_ip_port)
34 while 1:
35 # 给服务器端发送的消息
36 to_server_msg = input('刘力说:')
37 client.send(to_server_msg.encode('utf-8'))
38
39 # 判断如果客户端输入的是bye就退出
40 if to_server_msg.upper() == 'bye':
41 break
42
43 # 接收服务端返回的消息并打印
44 from_server_msg = client.recv(1024)
45 print('王萌说:',from_server_msg.decode('utf-8'))
46
47 # 如果服务器端返回bye,就退出
48 if from_server_msg.decode('utf-8') == 'bye':
49 break
50 client.close()
注意: 先运行server,然后再运行client,然后你会发现client这个文件再输出台的地方让你输入内容,你输入一个内容然后回车,你会发现server那边的控制台就输出了以client发送的内容
事例4
1 每隔5s把时间戳时间转换为格式化时间
2 服务端
3 import socket,time
4 server = socket.socket()
5 ip_port = ('192.168.12.42', 8002)
6 server.bind(ip_port)
7 server.listen()
8 conn,addr = server.accept()
9 while 1:
10 # 接收客户端发送来的字节,然后打印,解码decode
11 from_client_msg = conn.recv(1024)
12 print(from_client_msg.decode('utf-8'))
13
14 # 发送给客户端的消息,因为发送的必须是字符,所以必须转码encode
15 conn.send(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(float(from_client_msg.decode('utf-8')))).encode('utf-8'))
16
17
18 客户端
19 import socket,time
20 client = socket.socket()
21 server_ip_port = ('192.168.12.42', 8002)
22 client.connect(server_ip_port)
23 while 1:
24 # 发送给服务器端的时间(因为传递的必须是字节,所以必须转码encode)
25 to_server_msg = time.time()
26 client.send(str(to_server_msg).encode('utf-8'))
27
28 # 接收服务器端返回的格式化时间(因为接收过来的是字节,所以必须解码decode)
29 from_server_msg = client.recv(1024)
30 print(from_server_msg.decode('utf-8'))
31 time.sleep(5)