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

相关推荐

  • 分区管理

    分区管理     一.磁盘分类 机械硬盘(HDD):该硬盘是传统的普通硬盘。主要有:盘片,磁头,盘片转轴及控制电机,磁头控制器,数据转换器,接口,缓存等几个部分组成  固态硬盘(SSD):用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元组成。 二.特点 1.     &n…

    Linux干货 2017-08-20
  • scp命令

    scp命令: 基于ssh连接完成复制   scp  [options]  SRC…  DEST/ scp  [options]  SRC  DEST   存在两种使用情形: PULL获取:  scp  [options]  [user@]host:/PATH/TO/SOMEFILE   /PATH/TO/SOMEFILE PU…

    Linux干货 2017-10-21
  • 推荐-Nginx Proxy模块的应用之负载均衡

    Ngnix Proxy模块的应用之负载均衡 Ngnix Proxy模块的应用之负载均衡 Proxy 模块介绍 实验环境 配置Proxy Proxy 模块介绍   在我之前的文章提到过,Nginx可以提供反向代理加速、基于应用层的负载均衡并能对后端服务器做健康状态检测。下面我们就动手操作一下,看如何实现上述功能。 实验环境 主机名称 主要功能 外网地址 内网地…

    Linux干货 2016-03-27
  • 学习宣言

    没有学不会的技术,只有不勤奋的人!

    Linux干货 2016-12-28
  • 搭建路由环境

        五个虚拟机分别模拟三个路由器和两个主机,实现不同网段的主机之间的通信。 1.规定四个网段的ip地址:分别是192.168.1.0/24;192.168.2.0/24;192.168.3.0/24;192.168.4.0/24 2.三个路由器命名为R1、R2、R3。R1的两个网关地址为192.168.1.1和19…

    2017-08-20
  • 学习的第二周

    硬链接不能跨分区,硬链接不支持对目录的创建, 硬链接的本质是一个文件N个节点  ls |xargs rm 解决参数太长 无法正常删除的问题。   软连接 依赖于原始文件 删除就没了软连接可以跨分区,可以根据目录创建软连接,而且还可以针对文件夹 软连接依赖于原始文件。原始文件删了软连接就打不开了  相对路径一般相对当前工作目录,但…

    Linux干货 2017-05-30