windows(win8)和linux(CentOS)的socket小程序演示和错误解决
2016-01-01 17:00
621 查看
这篇博文很小白,主要是为了帮助自己熟悉一些流程和记录一些小bug,希望也能帮到跟我一样刚刚起步的新人。。。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/4d902ab0bab2e7aa13bf5bc1e36ee9b1)
对应的客户端小程序是代码清单14-2:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/46e06acbe8442697495e308577cae44f)
我用的是eclipse,eclipse和pydev搭建python开发环境你可以参考这里:/article/4621354.html
先运行服务器小程序,再运行客户端小程序。
运行服务器小程序时包如下错误:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/ca858c40725cd6c840b57173ab5211c2)
原来是包名冲突:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/53df2b921a091ac691b50551eed486ab)
因为我引用了socket模块,而我程序所在的包名也叫socket,把程序所在包名换个名字就OK了。
成功运行的话,服务端程序的控制台会输出如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/df9e8c1359e3c0ef6fceb87750877908)
客户端程序会输出(客户端可运行多次):
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/a2fb0c38b7c45096d34b4046663bbd1f)
注意:本程序中笔记本既充当了服务器,又充当了客户端
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/c33b4a43e680bbb5c385c539a85b52e6)
因为我们的服务器小程序使用了端口1234,我们用netstat
–aon|findstr1234查看一下该端口的状态:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/9baf07a3f59a5478704497fc23fa1444)
这个端口现在由pid为4512的进程占用,再查看这个是否就是由我们写的python小程序:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/847e826105faadd0cc8968644bece5a7)
确实是被我们写的python小服务器程序所占用。
现在eclipse里运行客户端小程序(确保服务器小程序正在运行),看一下1234端口的状态变化
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/b913cf36c0072b5c961be1c6dc257e6b)
我运行了3次客户机小程序,便多了3条上面的连接状态信息,TIME_WAIT表示这个套接字已经关闭,正在等待远程套接字的关闭传送。其他状态的意思如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/e08d90c662e1bb2e1ffe71b5eb76a684)
在这里我们补充一点TCP连接的知识:当一台机器(客户端)企图跟一台提供服务的机器(服务器)建立TCP连接时,他们必须先按次序交换通讯好几次,这样TCP连接才能建立起来,我们称之为三次握手。开始客户端会发送一个带SYN标记的包到服务端;服务端收到这样的带SYN标记的包后,会发送一个带SYN-ACK标记的包到客户端作为确认;当客户端收到服务端这个带SYN-ACK标记的包后,会向服务端发送一个带ACK标记的包。完成这个三次握手的步骤,他们的TCP连接就建立起来了,可以进行数据通讯。
想了解更多关于tcp连接的资料,可参考如下链接:
/article/5196732.html
/article/1777486.html
http://www.2cto.com/net/201209/157585.html
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/9248924b603d0dc58dcbf4cfd6135b02)
直接执行python code14_1_server.py或者用chmod a+x code14_1_server.py为该代码添加可执行权限,然后./code14_1_server.py也可以执行该程序。
我的当时出现这个错误:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/8f9a252d5dcd04eb4f4e42184038a001)
因为代码里使用了
port = 1234
serverAddr = (host, port)
s.bind(serverAddr)
服务器的主机名字获得失败,发现ping 主机名也不通
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/699ad34338c07cfa1b5c49b4f395a091)
方法1:直接写服务器的ip地址:serverAddr
= (('x.x.x.33', port))
方法2:为了方便用名字通信,做以下配置:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/9fb2e327e00e7a947d88eae6e2e5ef10)
加上你的主机的ip与主机名的映射(在所有需要互相按名字访问的机器上)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/2ede939b63153109e10c048f71daff7d)
这样也可以使得主机们之间能用主机名互相ping通(所有的主机都得配置,包括gb34)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/0003083de1f2a7e1175fc4a964c6eb06)
再次执行服务器小程序,不再报错:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/ca89a556dd8b282c4e579c7e01be56d5)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/8b0ec2e4bbc32d2e6987c459fab15c1b)
运行客户端小程序,:python code14_1_client.py,报如下错误:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/7e5de4455b1dc0e40dc7dfdf91616881)
因为没有关闭服务器端的iptables
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/7e8165fafe1a90089d63cd98aa2adb25)
再次运行客户端小程序:
gb34客户端输出:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/b4b05b8a3a1b5290d892ba712502452d)
gb33服务端输出:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/33ed74b6662209824d7f8fc13db1934a)
程序成功运行。
如果在运行客户端时出现如下错误,有可能是你的服务端小程序没有成功启动哦。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/57af77ea0cc705b4b74844d726c6e87d)
2.4查看服务器1234端口状态
现在gb34上运行3词客户端程序:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/b030fe4d018d4a2aae66d7aed94caf2e)
在查看服务端:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/20/90f614c07417dc3094f79d9902e748e1)
再在服务端查看端口1234状态:netstat -an|grep 1234
1.笔记本上的socket的小程序演示
1.1编写自己的服务器和客户端小程序(python版)
这里的服务器小程序参考了Python基础教程(第2版)第243页的代码清单14-1对应的客户端小程序是代码清单14-2:
我用的是eclipse,eclipse和pydev搭建python开发环境你可以参考这里:/article/4621354.html
先运行服务器小程序,再运行客户端小程序。
运行服务器小程序时包如下错误:
原来是包名冲突:
因为我引用了socket模块,而我程序所在的包名也叫socket,把程序所在包名换个名字就OK了。
成功运行的话,服务端程序的控制台会输出如下:
客户端程序会输出(客户端可运行多次):
注意:本程序中笔记本既充当了服务器,又充当了客户端
1.2查看服务器程序所用端口1234的状态
右键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连接的资料,可参考如下链接:
/article/5196732.html
/article/1777486.html
http://www.2cto.com/net/201209/157585.html
2.CentOS上的socket的小程序演示
2.1实验简述
我有两台服务器gb33, gb44,在gb33上运行服务器小程序,在gb34上运行客户端小程序,两台机器均是CentOS6.72.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
相关文章推荐
- 在Centos中安装Octave的方法
- Linux关于总线、设备、驱动的注册顺序
- 最常用的20个监控Linux系统性能的命令行工具
- LINUX下编译c++11的代码
- Linux终端切换和ls、cd、date、shutdown相关命令
- 第一篇 linux中红黑树的具体实现及迁移,应用
- linux学习之四---gdb调试
- GraphicsMagick Linux 安装
- Linux查看某个目录/文件大小
- Linux查看系统负载常用命令
- 关于linux的systemd的一些事
- 每天一个Linux之locate命令
- Linux下rsync增加SSH端口号的用法
- linux系统启动流程(MBR)
- linux基础知识总结
- CentOS Linux修改系统时区
- Linux下安装GAMS建模优化工具
- Centos7安装gitlab
- linux添加一个kernel
- 银行家算法的数组方式实现