计算机网络实验——基于TCP协议的socket编程

2023-05-16

一、实验目的

1. 实现一个能够在局域网中进行点对点聊天的实用程序。

2. 熟悉c++、Java等高级编程语言网络编程的基本操作。

3. 基本了解对话框应用程序的编写过程。

4. 实现TCP套接字编程。

 

二、实验内容

(一)实验思路

1、学习理解TCP协议。

2、实现TCP客户端之间多线程通信以及聊天页面的UI实现。

 

(二)实验步骤

1、理解TCP协议。

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

TCP使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。

TCP三次握手的过程如下:

a. 客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。

b. 服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。

c. 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。

三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。

1、实现TCP客户端之间多线程通信以及聊天页面的UI实现。

(1)服务器

服务器先创建一个套接字,然后将该套接字和特定端口绑定,然后服务器开始在此套接字上监听,直到收到一个客户端的连接请求,然后服务器与客户端建立连接,连接成功后和该客户端进行通信(相互接收和发送数据),最后,服务器和客户端断开连接,继续在端口上监听。

因为多人聊天中服务器要同时与多个客户机建立连接并通信,需要多线程实现,服务器每建立一个连接就会开辟一个新的线程为该客户机服务,服务器继续监听。结合多人聊天的场景,这里的服务器实际上起到消息中转的作用,将客户端发给它的消息转发给与之相连的所有客户端,以间接实现客户端之间的通信。

【关键代码】:

l 创建一个集合,存放客户端的对象。

l 使用ServerSocket创建TCP套接字,ServerSocket带有输入输出缓冲区,不需要创建数据报去接收数据,而是直接从ServerSocket的缓冲区中读取。然后绑定特定端口,开启监听。

l 等待客户端连接,一旦有客户端连接服务器就存放到集合中。服务器持续监听服务器端口,一旦有数据发送过来,那么就将数据封装成socket对象,如果没有数据发送过来,那么这时处于线程阻塞状态,不会向下继续执行。

l 获得客户端的IP地址,new一个thread,传入socket和IP两个参数,并调用start方法启动线程。

子线程实现

1、这里的socket和IP就是之前传进来的那两个参数。

2、通知用户上线消息。

3、读取Socket读取流中的数据

4、将读取到的流中的数据发送给每一个和服务器建立起TCP连接的客户端。

5、主函数:创建一个服务器对象,调用了其构造方法。

(1)客户端

    客户端创建一个套接字,里面包含了服务器的地址和端口号,TCP客户端的端口号由系统自动分配,不需要指明。和服务器建立连接,如果连接成功则socket创建成功。然后客户端开启接受数据线程。通信结束后主动断开连接,释放资源。

【关键代码】

l 写了一个函数用来连接服务器。其中要创建套接字,然后和服务器建立连接。

客户端接受消息的子线程实现:recvMsg类

(SetMenu是UI的实现部分,放到后面再提。)线程传入的参数是socket。MessageArea是用来显示消息的区域。

重写run方法:

定义一个socket读取流,读取服务器返回的消息,然后将消息添加到显示区域。

主函数

主函数中首先和服务器建立连接,然后设计GUI界面,最后开启接收数据的线程。

GUI实现:setMenu类

1、创建一个类用来实现UI。SetMenu类中先创建一些静态的UI组件方便别的类调用,然后将socket作为参数传入构造函数,再实现菜单的创建和一些相关事件的监听。

2、 相关事件监听操作:

3、面板的生成与组件的设置:

4、发送消息功能的实现:

发送完输入文本框中的内容以后,要将输入框清空。在发送消息的同时也要把消息在服务器显示(这里在控制台打印输出)。

一、实验结果

首先运行服务器程序,服务器开启监听:

然后运行多个客户端,每一个客户端都会显示连接是否成功。

多人聊天界面:

四、实验总结

这次基于TCP协议的socket编程实验。最初我实现了客户端和服务器之间基于TCP协议的通信,然后在这个基础上加入了多线程部分以实现多人聊天,并且最终实现了聊天的界面。

上一次基于UDP协议的socket编程实验和这一次有很多相同的地方,也感受到了UDP与TCP协议之间的区别。递进的实验环节让我理解了TCP协议下通信的实现,另外对于多线程有了进一步理解。

————————————————————————————————————————————

继续加油哦ヾ(◍°∇°◍)ノ゙

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机网络实验——基于TCP协议的socket编程 的相关文章

随机推荐

  • UART详解

    UART 通用异步收发传输器 xff08 Universal Asynchronous Receiver Transmitter xff0c 通常称作UART xff09 是一种串行异步收发协议 xff0c 应用十分广泛 UART工作原理是
  • Python订阅自定义ROS topic并读取message

    背景 最近部署了基于ROS的实时稠密场景建图 参考Elastic bridge 现在需要用python获取相机每一时刻的pose 该pose的消息类型定义在FrameState msg 文件中 具体内容如下 uint64 seq uint6
  • 要点初见:双硬盘下的Win10+Ubuntu16.04双系统安装

    按照网上博客的安装教程安装的Win10 43 Ubuntu16 04双系统安装了好几遍都不成功 xff1f 启动Ubuntu左上一直有个光标在闪 xff1f 如果你的电脑也是双硬盘 xff08 装Windows系统的固态硬盘 43 机械硬盘
  • 要点初见:OpenCV3中ORB特征提取算法的实现与分析

    ORB特征提取算法是一种通过检测提取待测图片与模板图片中的灰度特征 xff0c 实现模板图片与待测图片匹配的一种特征提取算法 相比于模板匹配matchTemple xff0c ORB更集中于图像的灰度细节 xff0c 速度也更快 ORB的全
  • 为什么模板函数应该定义在头文件内

    为什么模板函数应该定义在头文件内 tang05505622334的博客 CSDN博客 头文件 模板函数 参考 xff1a https www cnblogs com cnsec p 3789824 htmlgeneral的编译链接过程 xf
  • Cartographer详解

    Cartographer 论文解读 一 Introduction 在建图上应用SLAM并不是一个新的概念 xff0c 这里不再作为本文的重点 本文的贡献在于 xff1a 提出了一种新的基于激光数据的回环检测方法 xff0c 这种方法可以减少
  • C语言实现TCP通信

    C语言通过socket编程实现TCP通信 服务端客户端通信例子 xff1a socket tcp 通信1 xff0c socket tcp通信2 xff0c udp使用讲解 xff0c socket udp通信例子 TCP IP协议 叫做传
  • KF与无迹卡尔曼滤波详解

    这是另一片写卡尔曼滤波的文章 xff0c 亮点在与总结的卡尔曼滤波的五个公式 xff0c 可通过上一篇理解卡尔曼滤波的推导原理 xff0c 本篇用来理解卡尔曼滤波的计算实现 1 xff0e 简介 Brief Introduction 在学习
  • 保存并查看Lego-Loam的三维点云地图

    Loam的安装及运行方法可以参考 https blog csdn net qq 36396941 article details 82973772 本文提供ROS wiki http wiki ros org loam velodyne上无
  • Could not find a package configuration file provided by “OpenCV“ with any of the following names

    CMake Error at opt ros kinetic share catkin cmake catkinConfig cmake 83 find package Could not find a package configurat
  • EKF的通俗理解

    导 xff1a ekf xff0c 扩展卡尔曼滤波简称 xff0c 应用非常广泛 xff1b 1 五个黄金公式 2 应用场合 1 xff09 找清楚模型 2 xff09 对准五个公式的公式 3 xff09 实现 xff1a 求革新值 xff
  • error: Could NOT find pugixml (missing: PUGIXML_LIBRARIES PUGIXML_INCLUDE_DIRS)

    解决办法 xff1a sudo apt get install libpugixml dev sudo apt get install libpugixml1v5
  • STM32小四轴超低成本方案开源项目

    先分享几个小四轴无人机项目 新唐M452飞控开源项目 xff0c 虽然完全开源但是还不够成熟 xff0c PID调节感觉还有些问题 助你轻松DIY四轴飞行器 新唐M452飞控套件评测 电路城 MWC 飞控 xff0c 采用arduino编程
  • Autoware 主要模块

    引言 本文参考Autoware wiki overview xff0c 主要描述了Autoware的整体框架和模块描述 xff0c 主要包括感知和规划两大部分 感知包括定位模块 xff0c 检测模块 xff0c 预测模块 定位模块使用3D
  • DWA算法原理

    DWA算法 局部路径规划简介 机器人在获得目的地信息后 xff0c 首先经过全局路径规划规划出一条大致可行的路线 xff0c 然后调用局部路径规划器根据这条路线及costmap的信息规划出机器人在局部时做出具体行动策略 xff0c ROS中
  • ROS与深度相机入门教程:(1)Ubuntu16.04 在ROS中驱动Intel D435i深度相机

    Intel在Github上开源了支持所有RealSense系列相机的SDK 包括了D400 SR300系列深度相机和T265双目跟踪相机 支持Linux Windows Mac OS以及Android 链接 https github com
  • CMakeLists生成和载入动态链接库

    CMakeLists生成和载入动态链接库 生成动态链接库 新建一个文件夹 xff0c 暂且命名为 makeDllLib 文件夹中放入三个文件 c和 h和 def 其中 def文件是非必须的 xff0c 但它有利于生成 lib文件和导出函数
  • 串口传输 波特率 延时时间的设置

    在进行串口传输的时候 xff0c 波特率太低接收不到 xff0c 波特率太高又丢包 首先 xff0c 传输的报文需要多少时间 起始位1 xff0c 停止位1 xff0c 数据位8 xff0c 则传输时间为 xff1a 1000 xff08
  • 阶段进度条

    public class PhaseProgressView extends View 节点连线宽度 private int mLineWidth 节点个数 private int mNodeNum 选中节点位置 private int m
  • 计算机网络实验——基于TCP协议的socket编程

    一 实验目的 1 实现一个能够在局域网中进行点对点聊天的实用程序 2 熟悉c 43 43 Java等高级编程语言网络编程的基本操作 3 基本了解对话框应用程序的编写过程 4 实现TCP套接字编程 二 实验内容 xff08 一 xff09 实