标签:停止 启动 img 结果 编程 clip nec 端口号 uml
1、 服务器端
# -*- coding: UTF-8 -*- import socket serverSocket = socket.socket() #创建socket对象 ‘‘‘ 绑定 IP 和端口号 socket.gethostname() 为获取本机名,这里也可以直接写 IP 地址,因为测试在本人机器上,所以直接获取主机名 同样你应该也是测试在你的机器上,也可以用这种方法,也可以直接写你的 IP 地址 以后用在服务器上,直接写服务器 IP 地址,当然一般用配置文件读取(以我 20ml 水的经验来看,我的经验还没有半桶水) 注意客户端连接时,IP和端口号必须和这里一样,毕竟你要访问的服务器是这个 ‘‘‘ serverSocket.bind((socket.gethostname(), 12345)) serverSocket.listen(5) #开始监听有没有客户端连接 print ‘服务端开始监听‘ while True: conn, clientAdress = serverSocket.accept() #有客户端访问了,返回的是连接对象和客户端地址 print ‘这是连接的对象:‘, conn print ‘这是客户端的地址:‘, clientAdress dataFormClient = conn.recv(1024) #从客户端接收数据,如果客户端不发送数据,也可以不写这行代码 print ‘这是从客户端接收到的数据:‘, dataFormClient conn.send(‘这是服务端给客户端发送的数据‘) #发送数据给客户端 print ‘服务端给客户端发送信息成功‘ conn.close() #关闭连接 print ‘服务端停止监听‘
没有客户端连接时的运行结果
服务端开始监听
有客户端连接时的运行结果(当然你得先写客户端,直接看客户端代码吧)
服务端开始监听 这是连接的对象: <socket._socketobject object at 0x00000000031A4A70> 这是客户端的地址: (‘10.190.20.65‘, 59788) 这是从客户端接收到的数据: 这是客户端发给服务端的数据 服务端给客户端发送信息成功
2、 客户端
# -*- coding: UTF-8 -*- import socket clientSocket = socket.socket() #创建socket对象 clientSocket.connect((socket.gethostname(), 12345)) #连接服务端,IP 和端口号需要和服务端相同 print ‘客户端正在运行‘.decode(‘UTF-8‘) #用 UTF-8 编码这句话,因为我在cmd 运行,不编码输出为乱码 clientSocket.sendall(‘这是客户端发给服务端的数据‘) #发送数据给服务端 dataFromServer = clientSocket.recv(1024) #接收服务端发来的数据 print ‘从服务器接收的消息为:‘.decode(‘UTF-8‘), dataFromServer.decode(‘UTF-8‘) #原因同上 clientSocket.close() #关闭连接
运行结果
客户端正在运行
从服务器接收的消息为: 这是服务端给客户端发送的数据
温馨提示 : 1、 一般模拟服务端和客户端,我采用的方法是用 eclipse 运行服务端(你也可以用你的编译工具运行),再用 cmd 运行客户端,这样很形象就能看出来服务端和客户端的输出了。如果没有编译工具,那就用两个 cmd 运行嘛,但是得注意编码哟,如果代码中没有中文,那一切 OK ,如果用中文,那用我的那种办法 .decode(‘UTF-8‘) 就行了
2、 服务端和客户端的 IP 和端口号 需要一致,否则客户端连接不到服务端,服务端接收不到客户端的连接
3、服务器代码中有接收数据代码,那客户端就得有发送数据代码,否则服务端会一直等待接收数据(我第一次就这样,尴尬了)
4、 因为bind()那一行导致运行错误出现错误,可以参考下面的常见错误,也提供了解决办法
常见错误 1:
socket.error: [Errno 10048] ???ÿ?????????(Э??/??????/???)
本人理解错误原因为 : 服务器未正常关闭,再次重启(重新运行 .py 文件)时触发该异常,也就是没关闭服务器,再次运行该文件,导致 bind() 再次绑定IP 和端口号时触发异常
本人解决办法 : 先关闭服务器后再运行。个人总结有两类情况
1、 如果用的是编译工具,如 eclipse, 它有关闭按钮,看截图,点击一下,再次运行应该就可以了,如果还是启动不了,还是报错,那就关闭编译工具,然后再打开试一试,如果还不行,直接用 cmd 运行试一试,还不行,那我也不知道了,或许是你写错了代码,或许是别的原因,以我现在的水平解决不了。
2、 如果直接用 cmd 运行,提示信息是这样子的,截图如下
解决办法 : 总有一个地方已经打开了该服务,进行了 bind() 操作,所以你需要找到,然后停止它,可以尝试关闭 cmd 再次打开。总之原理就是服务已经在别的地方打开但没关闭,因此你得找到它关闭它,再重试。
常见错误2 :
错误提示 :
TypeError: bind() takes exactly one argument (2 given)
错误原因 : bind()只需要一个参数,给了两个
解决办法 : bind((ipNumer, portNumber)) 注意是两个括号,估计你少了一个
标签:停止 启动 img 结果 编程 clip nec 端口号 uml
原文地址:https://www.cnblogs.com/rainbow-tan/p/11358097.html