这篇博文很小白,主要是为了帮助自己熟悉一些流程和记录一些小bug,希望也能帮到跟我一样刚刚起步的新人。。。
这里的服务器小程序参考了Python基础教程(第2版)第243页的代码清单14-1
对应的客户端小程序是代码清单14-2:
我用的是eclipse,eclipse和pydev搭建python开发环境你可以参考这里:http://www.cnblogs.com/linjiqin/p/3579995.html
先运行服务器小程序,再运行客户端小程序。
运行服务器小程序时包如下错误:
原来是包名冲突:
因为我引用了socket模块,而我程序所在的包名也叫socket,把程序所在包名换个名字就OK了。
成功运行的话,服务端程序的控制台会输出如下:
客户端程序会输出(客户端可运行多次):
注意:本程序中笔记本既充当了服务器,又充当了客户端
右键win键,选择“命令提示符(管理员)”,进入如下界面:
因为我们的服务器小程序使用了端口1234,我们用netstat –aon|findstr1234查看一下该端口的状态:
这个端口现在由pid为4512的进程占用,再查看这个是否就是由我们写的python小程序:
确实是被我们写的python小服务器程序所占用。
现在eclipse里运行客户端小程序(确保服务器小程序正在运行),看一下1234端口的状态变化
我运行了3次客户机小程序,便多了3条上面的连接状态信息,TIME_WAIT表示这个套接字已经关闭,正在等待远程套接字的关闭传送。其他状态的意思如下:
在这里我们补充一点TCP连接的知识:当一台机器(客户端)企图跟一台提供服务的机器(服务器)建立TCP连接时,他们必须先按次序交换通讯好几次,这样TCP连接才能建立起来,我们称之为三次握手。开始客户端会发送一个带SYN标记的包到服务端;服务端收到这样的带SYN标记的包后,会发送一个带SYN-ACK标记的包到客户端作为确认;当客户端收到服务端这个带SYN-ACK标记的包后,会向服务端发送一个带ACK标记的包。完成这个三次握手的步骤,他们的TCP连接就建立起来了,可以进行数据通讯。
想了解更多关于tcp连接的资料,可参考如下链接:
http://www.cnblogs.com/qlee/archive/2011/07/12/2104089.html
http://blog.csdn.net/zhangbiao1981/article/details/4152327
http://www.2cto.com/net/201209/157585.html
我有两台服务器gb33, gb44,在gb33上运行服务器小程序,在gb34上运行客户端小程序,两台机器均是CentOS6.7
与上面同样的服务端小程序放在我的gb33上,名字为code14_1_server.py
直接执行python code14_1_server.py或者用chmod a+x code14_1_server.py为该代码添加可执行权限,然后./code14_1_server.py也可以执行该程序。
我的当时出现这个错误:
因为代码里使用了
port = 1234
serverAddr = (host, port)
s.bind(serverAddr)
服务器的主机名字获得失败,发现ping 主机名也不通
方法1:直接写服务器的ip地址:serverAddr = (('x.x.x.33', port))
方法2:为了方便用名字通信,做以下配置:
加上你的主机的ip与主机名的映射(在所有需要互相按名字访问的机器上)
这样也可以使得主机们之间能用主机名互相ping通(所有的主机都得配置,包括gb34)
再次执行服务器小程序,不再报错:
在gb34上执行客户端小程序,客户端小程序唯一的变动就是要改获取服务器主机名的代码,因为现在服务器和客户端不是在同一机器上了,服务端要改成真正的服务器主机,在这里gb33是服务器。
运行客户端小程序,:python code14_1_client.py,报如下错误:
因为没有关闭服务器端的iptables
再次运行客户端小程序:
gb34客户端输出:
gb33服务端输出:
程序成功运行。
如果在运行客户端时出现如下错误,有可能是你的服务端小程序没有成功启动哦。
2.4查看服务器1234端口状态
现在gb34上运行3词客户端程序:
在查看服务端:
再在服务端查看端口1234状态:netstat -an|grep 1234