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 18:17
下一篇 2018-01-01 19:36

相关推荐

  • 马哥网络教育班21期-第一周课程练习

      一、计算机的组成及其功能 1.1计算机的组成      1946年美籍匈牙利科学家冯·诺依曼提出存储程序原理,把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式存储,并确定了存储程序计算机的五大组成部分,分别为运算器、控制器、存储器、输入设备和输出设备。 1.2计算机的组成 控制器(Contro…

    Linux干货 2016-07-12
  • 马哥教育网络班22期+第1周课程练习

    1、描述计算机的组成及其功能。     计算机由五大功能部分组成(冯诺依曼体系):运算器、控制器、储存器、输入设备、输出设备,对应到具体的硬件设备如下:     CPU    :    包含运算器、控…

    Linux干货 2016-08-15
  • 从Linux小白到大牛——与狼共舞的日子3

    马哥教育网络班21期+第3周课程练习 1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@localhost ~]# who root :0   2016-07-23 08:55 (:0) wangsining pts…

    Linux干货 2016-07-26
  • find使用详解

    文件查找是根据文件的各种属性去找到相对应的文件。 文件查找分为实时查找和非实时查找。     非实时查找是根据索引来进行查找;虽然非实时查找查询速度快,但在构建索引时相当占用资源,只有在系统空闲时才能进行,这样有可能会造成索引内容与当前系统中文件的状态不一致的情况,所以查找结果有可能会不准确。   …

    Linux干货 2015-03-18
  • 自制Linux系统

                          自制Linux系统 1、环境准备:         在centos6上添加一块新硬盘,并分区格式化。 &n…

    系统运维 2016-09-21
  • LINUX系统文件类型分类

    使用LINUX过程中,时常会对文件进行操作。但是linux中文件究竟有哪些分类呢?今天让我们大家来总结一下吧! 概述:         linux文件可以分为五种类型,分别为:普通文件、目录、字符设备或块设备、套接口文件、符号链接文件。下面详细介绍这几种文件。 1 普通文件[root@lo…

    Linux干货 2017-07-22