先说一下为什么要发这个随笔:
最近在玩python,通过学习socket,就想试试服务器和客户端的通信。^_^
ip和端口这俩有点东西,一顿乱整摸出点门路,也算是为我下学期的计算机网络打下了铺垫了^_^
情景1:
写了客户端和服务器的代码,先运行的客户端,一直在提示如下图
相信都知道为什么了,服务器还没有先执行,都没有listen,所以出现了这种情况
解决办法:先运行服务器的代码,再跑客户端
情景2:
这种情况是运行了两次服务器代码(眼神不好就不要乱运行!!)
不要默认点运行的第一个按钮,要不总是运行的都是上一次的代码。以后一定注意。
情景3:
说说ip地址,通常客户端连接的是自己机器上的ipv4地址,服务器输入(0.0.0.0)就好了。
Windows下查看在cmd中输入ipconfig
Mac和Linux在终端中输入:ifconfig
最后放两张运行成功的图片
客户端:
import socket
client = socket.socket()
client.connect(('10.211.55.31',8000))
client.send("bobby".encode("utf8"))
client.close
服务器:
import socket
server= socket.socket()
server.bind(('10.211.55.31',8000))
server.listen()
sock, addr = server.accept()
data = ""
while True:
temp_data = sock.recv(1024)
print(temp_data)
if temp_data:
data += temp_data.decode("utf8")
if temp_data.decode("utf8").endswith("#"):
break;
else:
break;
print(data)
sock.close
后来改进的代码:
客户端:
1 importsocket2 client =socket.socket()3 client.connect(('10.211.55.31',8000))4
5 whileTrue:6 input_data =input()7 client.send(input_data.encode("utf8"))8 server_data = client.recv(1024)9 print("服务器响应:{}".format(server_data.decode("utf8")))10 server_data2 = client.recv(1024)11 print("服务器响应:{}".format(server_data2.decode("utf8")))12 client.close
服务器:
1 importsocket2 importthreading3
4 server=socket.socket()5 server.bind(('10.211.55.31',8000))6 server.listen()7
8 defhand1e_sock(sock,addr):9 temp_data = sock.recv(1024)10 print(temp_data.decode("utf8"))11 input_data =input()12 sock.send(input_data.encode("utf8"))13 #获取客户端的连接并启动线程去处理
14 whileTrue:15 #阻塞等待链接
16 sock, addr =server.accept()17 #每当进来一个用户就启动一个线程去跟用户连接
18 client_thread = threading.Thread(target=hand1e_sock,args=(sock,addr))19 client_thread .start()20 #注意:传递的是方法的名称而不是方法的调用
21 data = ""
22 whileTrue:23 sock.send("welcome to server".encode("utf8"))24 temp_data = sock.recv(1024)25 print(temp_data.decode("utf8"))26 input_data =input()27 sock.send(input_data.encode("utf8"))28 #recv方法是阻塞的
29 iftemp_data:30 data += temp_data.decode("utf8")31 if temp_data.decode("utf8").endswith("#"):32 break;33 else:34 break;35 print(data)36 sock.close