tcp通讯的服务器和客户端解析

服务器端编程步骤,
1.创建Socket对象,下文中的socket都表示一个socket对象
2.绑定IP地址和端口,服务器的IP和端口
3.开始监听,将在指定的端口上监听,listen()
如果对方申请连接这个IP和端口,将被听到,这个过程
4.获取用于传输数据的Socket对象
socket.accept() ->(socket object,address info) 默认阻塞(线程不会停止但也不会执行后续程序)直到条件改变,
但是监听不会阻塞,外界仍可以查到这个端口正在监听
外边有客户端访问请求,获取到一个新的Socket对象和客户端地址的二元组.阻塞会解除,原来的socket的对象的监听不会停止,使用 socket.close()可以关闭监听,关闭监听就无法建立新的连接了
获取到一个新的Socket对象可以等待它发数据来接收或者发数据给它或者同时发数据并等待接收
要想对多个客户端通信需要再次设置socket.accept()(socket为原来监听的socket对象),每次要与一个客户端建立一次连接就需要设置一次socket.accept(),这样只能一次一次的建立连接,如果要同时建立多条连接的需要可以
把它的接收建立连接的请求设置在循环中,然后把与每条连接的会话放入一个线程中.这样就能在很短的时间建立多条连接了
5.使用新的Socket对象接收数据,和
data=socket.recv(1024)  要设定接收数据的大小.这个过程默认阻塞,对方申请连接后,并传递来信息,这句程序就能够执行,收到信息后这句话执行完毕,解除阻塞.
这句语句执行完毕后,客户端再有信息发送也不会收到,设置循环接收才可以不断接收数据. 这个过程中不断有阻塞等待,与会话本身无关的代码的执行手动阻碍,可以把会话放入一条线程,或者把其他操作放入线程,使得它们能够更快执行
除了接收也可以发送数据,socket.send(bytes) 发送字节型数据 ,发送数据不会有阻塞,所以没必要专门为它开辟线程
6.结束连接
结束监听,socket.close(),在不需要建立连接时就可以这么做了
结束与一个客户端的会话,对这个会话的Socket对象使用socket.close()立刻结束会话
在接收客户端的数据时,对方宕机等原因结束了会话,在data=socket.recv(1024)会报错,一般需要捕获这个可能的错误,然后关闭会话
程序结束,socket对象没有全部关闭,可能会代来一定的问题
tcp客户端编程步骤
1.创建Socket对象
2.不需绑定己方IP和端口,己方IP和端口由系统分配
3.连接服务器方的IP和端口socket.connect((‘127.0.0.1’,9999)),如果此时服务器和端口端没有listen(),就会报错
可以设置捕获错误. 如果服务器端触发了.accept(),就可以数据传输了
4.数据传输,使用Socket对象socket.send()发送数据和接收数据socket.recv(1024),这里接收数据是默认阻塞的,开辟线程执行别的程序或执行接收数据可以缓解等待.
收到信息后,这句话执行完毕,解除阻塞. 接收数据时对方宕机会接收数据时报错,需要设置捕获错误的代码
一般需要主动连接后,才能接收数据,不过
5.关闭连接
使用socket对象.close()就关闭了,不在能接收和发送数据
服务器依然可以发送数据,只是没有接收,所以一般要通过发送语句通知服务器端断开连接
tcp服务器端和客户端通讯的相同与区别
两者发送和接收对方的信息的方法相同
客户端需要connect才能发送信息,服务器端不需要连接就能发送信息(能指的是发出信息而不报错)
群聊实现分析:客户端发送信息到服务器,服务器返回相同信息到所有与它相连的客户端,这就实现了群聊

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/90706

(4)
daishitongdaishitong
上一篇 2018-01-01
下一篇 2018-01-01

相关推荐

  • 你会用Python写洗脑神曲吗?

    Python实战班-学员学习成果展示 同样是周末,有些人是闲聊着度过,有些人是学习充电度过。 人与人最大的区别,是下班后的时间。看你怎么去利用。 周末时,马哥Python实战班的学员正在认真上课,他们中的不少人,月薪在10k以上,甚至月薪20k以上。 但他们没有虚度周末时光。 #最浪费时间的就是:思而不学+犹豫不决。# 马哥Python实战班二期的小伙伴们才…

    Linux干货 2016-07-05
  • N22-第十周作业

    1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情) (1)POST:加电自检,利用COMS里记录的配置信息检测硬件是否都工作正常 (2)Boot Sequence: 按次序查找各引导设备,第一个有引导程序的设备即为本次启动要用到的设备 Grub引导程序:提供一个菜单,允许用户选择要启动的系统或不同的内核版本, 把用户选定的内…

    Linux干货 2016-10-25
  • 第一周作业

    1、描述计算机的组成及其功能 答:计算机主要有5大组件构成: 1) 计算器:用户数据计算,主要是指CPU 2) 控制器:用于控制数据流或者指令流,控制计算机系统的各个组件的协同工作以及信息的流动,如各种控制芯片(南桥,北桥等) 3) 存储器:用户数据的存放,如内存 4) 输入设备:如键盘,鼠标等 5) 输出设备:如显示器,外置的存储设备( 硬盘,光…

    Linux干货 2016-10-30
  • SSH原理与运用:远程登录

    如果本地用户名与远程用户名一致,登录时可以省略用户名。 1 $ ssh host SSH的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口。使用p参数,可以修改这个端口。 1 $ ssh –p 2222 user@host 上面这条命令表示,ssh直接连接远程主机的2222端口。 三、中间人攻击 SSH之所以能够保证安全,原因在于它…

    Linux干货 2017-08-14
  • 马哥教育网络班22期+第七周课程练习

    1、创建一个10G分区,并格式为ext4文件系统(1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl(2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳 # fdisk /dev/sdb <<EOF> n> p> 1> &g…

    Linux干货 2016-11-28
  • 第一周博客作业

    计算机的组成 CPU:运算器、控制器、寄存器、缓存 存储器:内存 RAM(Random-Access Memory) Input:输入指令、提供数据 Output: 输出数据加工后的结果 功能: 输入设备负责把用户的信息输入到计算机中 输出设备负责将计算机中的信息(包括程序和数据)传送到外部媒介,供用户查看或保存; 存储器负责存储数据和程序,并根据控制命令提…

    Linux干货 2017-01-10