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

相关推荐

  • 2017-10-4Linux基础知识(3)

    在上一章中讲到了操作系统的历史的发展以及Linux的如何诞生,在1991年的8月份,创始人Linus宣布成立Linux的,Larry Wall开发diff和patch打补丁的命令程序使得Linux可以在安全性方面有很大的提升。

    Linux干货 2017-10-05
  • 第10天:程序包,脚本,sed

    http://note.youdao.com/yws/public/redirect/share?id=b9432a76ff1180b42e01f6eb7c9fc90e&type=false

    Linux干货 2016-08-18
  • 第一周作业

    一·计算机组成及其功能     计算机由硬件和软件组成,他们构成计算机系统 硬件:构成计算机的物理装置包括中央控制器、存储器、输入设备、输出设备。 中央控制器(CPU):由控制器、运算器、寄存器和缓存组成。cpu的主频越高和缓存越大性能越好。主频是中央处理器时钟的频率,通常以兆赫兹(MHZ)为单位。缓存:可以进行高速数…

    Linux干货 2016-12-01
  • 初识linux的进程管理与作业控制(第十二天)

         进程:linux中,运行每一个二制进程序或触发每一个事件,系统都会将它定义为一个进程,并给一个进程号,称为PID。同时依据触发这个进程的用户与相关属性关系,给予这个PID一组有效的权限设置。          &nbsp…

    Linux干货 2016-06-01
  • Linux Shell基础脚本示例

    1、编写脚本/root/bin/systeminfo.sh,显示主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小.   2、编写脚本/root/bin/backup.sh,可实现自动将/etc/目录备份到/root/etcYYYY-mm-dd中.   3、编写脚本/root/bin/disk.…

    Linux干货 2016-08-15
  • 网络设备及工作

    集线器集线器又叫Hub,是一种多用于星形网络组织的中心设备。具备中继器放大信号的特点,集线器是一种半双工,同一时间只能接收或发送数据,不能同时既接受又发送数据,是冲突型设备,共享带宽,放大信号的同时放大噪声,不隔离广播,不能成环,不安全。 二层交换机二层交换机的工作原理能自学习构造MAC地址表,基于MAC地址表进行转发、划分冲突域,对MAC地址实现过滤等功能…

    Linux干货 2017-10-30