windows(win8)和linux(CentOS)的socket小程序演示和错误解决

来源:互联网 发布:scorecloud mac 编辑:程序博客网 时间:2024/05/11 12:56

这篇博文很小白,主要是为了帮助自己熟悉一些流程和记录一些小bug,希望也能帮到跟我一样刚刚起步的新人。。。

1.笔记本上的socket的小程序演示

1.1编写自己的服务器和客户端小程序(python)

   这里的服务器小程序参考了Python基础教程(2)243页的代码清单14-1

  

   对应的客户端小程序是代码清单14-2:

  

    我用的是eclipse,eclipse和pydev搭建python开发环境你可以参考这里:http://www.cnblogs.com/linjiqin/p/3579995.html

    先运行服务器小程序,再运行客户端小程序。

    运行服务器小程序时包如下错误:

   

    原来是包名冲突:

   

    因为我引用了socket模块,而我程序所在的包名也叫socket,把程序所在包名换个名字就OK了。

成功运行的话,服务端程序的控制台会输出如下:

 

    客户端程序会输出(客户端可运行多次):

   

    注意:本程序中笔记本既充当了服务器,又充当了客户端

1.2查看服务器程序所用端口1234的状态

    右键win键,选择命令提示符(管理员),进入如下界面:

   

    因为我们的服务器小程序使用了端口1234,我们用netstat –aon|findstr1234查看一下该端口的状态:   

     

    这个端口现在由pid4512的进程占用,再查看这个是否就是由我们写的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

2.CentOS上的socket的小程序演示

2.1实验简述

    我有两台服务器gb33, gb44,在gb33上运行服务器小程序,在gb34上运行客户端小程序,两台机器均是CentOS6.7

2.2运行服务器端代码

    与上面同样的服务端小程序放在我的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)

再次执行服务器小程序,不再报错:

2.3运行客户端代码

    在gb34上执行客户端小程序,客户端小程序唯一的变动就是要改获取服务器主机名的代码,因为现在服务器和客户端不是在同一机器上了,服务端要改成真正的服务器主机,在这里gb33是服务器。

   

    运行客户端小程序,:python code14_1_client.py,报如下错误:

因为没有关闭服务器端的iptables

再次运行客户端小程序:

gb34客户端输出:

gb33服务端输出:

程序成功运行。

如果在运行客户端时出现如下错误,有可能是你的服务端小程序没有成功启动哦。

2.4查看服务器1234端口状态

现在gb34上运行3词客户端程序:

在查看服务端:

再在服务端查看端口1234状态:netstat -an|grep 1234


1 0
原创粉丝点击