TCP协议程序设计

news2024/9/24 18:28:58

文章目录

  • 前言
  • 一、TCP协议程序是什么?
  • 二、使用步骤
    • 1.服务器端与客户端
    • 2.实操展示
  • 总结

前言

        TCP网络程序设计是指利用Socket类编写通信程序。利用TCP协议进行通讯的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序,两者的功能和编写方法不太一样。必须先启动服务器程序,调用accept()方法等待客户机程序启动,连接起服务器程序和客户机程序的就是相同的端口。


一、TCP协议程序是什么?

        TCP网络程序协议是一种基于传输控制协议(TCP)的网络通信协议。

        它定义了在计算机网络上进行通信时,如何建立、维护和关闭连接,以及如何传输数据的规则和约定。TCP网络程序协议提供了可靠的、面向连接的数据传输服务,确保数据的正确性和有序性。

        TCP协议基础是通过套接字(socket)建立的。

        它是Internet上最常用的协议之一,被广泛应用于Web浏览、电子邮件、文件传输、远程登录等网络应用中。举个例子,我们使用的QQ和微信,这些通信软件,都离不开TCP协议程序。

二、使用步骤

1.服务器端与客户端

        (1)服务器套接字(ServerSocket类)

        ServerSocket类的语法:

ServerSocket 对象 = new ServerSocket();
//创建非绑定服务器套接字(无指定端口和地址)

ServerSocket 对象 = new ServerSocket(int port);
//创建绑定特定端口的服务器套接字

ServerSocket 对象 = new ServerSocket(int port,int backlog);
//利用backlog创建服务器套接字,并将其绑定到本地端口号上

ServerSocket 对象 = new ServerSocket(int port,int backlog,InetAddress bindAddress);
/*使用指定的端口、侦听backlog和要绑定到的本地IP地址创建服务器。
  这种情况适用于计算机上有多块网卡和多个IP地址的情况,用户可以明
  确规定ServerSocket在哪块网卡或哪个IP地址上等待客户的连接请求。 */

        我们输入的端口值,就是设定该服务器的接入端口,任何客户机都需要使用这个端口值才能申请接入此服务器。

ServerSocket类的常用方法
方法功能描述返回类型
isBound()判断ServerSocket是否处于绑定状态boolean
bind(SocketAddress endpoint)将ServerSocket绑定到特定地址(IP地址和端口号)void
accept()等待客户端的连接,返回成功连接的Socket对象Socket
getInetAddress()返回此服务器套接字的本地地址int
isClosed()查看服务器套接字是否关闭boolean
close()关闭服务器套接字void

         accept()方法会阻塞线程的继续执行,直到接收到客户端的呼叫。如果没有客户端呼叫服务器,那么线程仍处于阻塞状态,后面的代码不会执行。(这时我们运行客户端代码后,阻塞状态结束)

        若没有客户端运行,产生客户请求,accept()方法也没有让线程阻塞,那么程序出了问题。可能是使用了一个被其他程序占用的端口号,或者ServerSocket绑定没有成功之类的。

        (2)客户端套接字(Socket类)

        Socket类的语法:

Socket 对象 = new Socket(String host,int port);
//创建一个连接到指定主机和端口的套接字
//host是服务器的IP地址或主机名,port是服务器上正在监听的端口号。

Socket 对象 = new Socket(InetAddress address,int port);
//使用InetAddress对象创建一个连接到指定地址和端口的套接字

Socket 对象 = new Socket(String host,int port,InetAddress localAddr,int localPort);
//创建一个连接到指定主机和端口的套接字,并指定本地地址和端口
//localAddr是本地地址,localPort是本地端口

Socket 对象 = new Socket(InetAddress address,int port,InetAddress localAddr,int localPort);
//使用InetAddress对象创建一个连接,并指定本地地址和端口

        以上为Socket对象的创建方法,其中第一个最常使用。

Socket类的常用方法
方法功能描述返回类型
getInputStream()返回与此套接字连接的输入流,用于读取从服务器发送的数据InputStream
getOutputStream()返回与此套接字连接的输出流,用于向服务器发送数据OutputStream
close()关闭此套接字并释放与之关联的资源void
isConnected()判断此套接字是否已经连接到远程主机boolean
isClosed()判断此套接字是否已关闭boolean
setSoTimeout(int timeout)设置套接字的超时时间(以毫秒为单位)。如果指定时间内没有数据可以,抛出SocketTimeoutException异常void
connect(SocketAddress endpoint)连接到指定的地址void
connect(SocketAddress endpoint,int timeout)连接到指定的地址,并设置连接超时时间void

2.实操展示

        TCP程序设计流程:

        所谓启动服务器、客户端,指的是运行相应的程序;关闭客户端、服务器,也是指相应的实例化对象调用close()方法进行套接字关闭。

        注意:该实操展示写了两个java文件,一个为服务器代码,另一个为客户端代码,两个文件各自先后运行,实现数据交互。 

        (1)服务器端代码:

import java.net.Socket; 
import java.net.ServerSocket; 
import java.io.InputStream;
public class Demo9 {    
    private InputStream inputStream; 
    private ServerSocket server; 
    private Socket socket; 
    void server(){ 
        try { 
            server = new ServerSocket(1024); 
            System.out.println("服务器端口已建立,等待用户端连接..."); 
            socket = server.accept();   //等待用户接入 
            inputStream = socket.getInputStream();
            byte b[] =new byte[1024];
            int len = inputStream.read(b);
            String string = new String(b,0,len);
            System.out.println("来自客户端的消息:"+string);
            System.out.println("客户端IP:"+socket.getInetAddress());
        } catch (Exception e) { 
            e.printStackTrace(); 
        }finally{
            inputStream.close();
            server.close();
        } 
    } 
    public static void main(String[] args) { 
       Demo9 demo9 = new Demo9(); 
       demo9.server(); 
    } 
}

        创建服务器套接字,并设定端口号为1024。使用accept()方法监听客户端的申请。再通过ServerSocket类的getInputStream()方法和IO输入流读取客户端发来的信息。最后根据socket对象,获取发送信息的客户机的公共IP地址。最后关闭各种流,释放系统资源。

        (2)客户机端代码:

import java.net.Socket;
import javax.swing.JFrame;
import java.io.OutputStream;

public class Demo10 extends JFrame{
    private OutputStream out;
    private Socket socket;

    private void connect(){
        System.out.println("尝试与服务器连接...");
        try {
            socket = new Socket("127.0.0.1", 1024);
            String string = "向服务器输送数据中...";
            out = socket.getOutputStream();
            out.write(string.getBytes());
            System.out.println("接入成功");
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            out.close();
            socket.close();
        }
    }
 
    public static void main(String[] args) {
        Demo10 demo10 = new Demo10();
        demo10.connect();
    }

}

        创建客户机套接字,实例化时输入目标主机的公共IP地址和开放的端口号。使用getOutputStream()方法和IO输出流的write()方法向服务器输入数据。最后关闭各种流,释放系统资源。

        运行结果:

        运行服务器代码,服务器端启动,等待客户端接入:

        运行客户端代码,客户端启动,接入服务器,发送数据:

        此时再去查看服务器处终端的反馈:

        如上图所示,“向服务器输送数据中...”这段字符串就是从客户端向服务器发过来的,通过IO流。

        而发送这条信息的客户端,正是我自己的笔记本。我的笔记本既是服务器,又是客户端,所以当服务器终端输出发送数据的客户端的IP地址,就是我的本地主机地址(当然我也可以显示为我的公共IP地址)。

        总而言之,获取到客户端的信息,并且可以获取到该客户端的公共IP地址。


总结

        以上就是TCP协议的程序设计,本文简单介绍如何搭建TCP程序,而TCP程序在开发应用程序,搭建网站,尤其对于网络通信提供了大量快速便捷的的函数和方法。如果有补充或者指正的内容,欢迎读者在评论区中留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1989402.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go语言编程大全,web微服务数据库十大专题精讲

本课程主要从数据结构、Go Module 依赖管理、IO编程、数据库编程、消息队列、加密技术与网络安全、爬虫与反爬虫、web开发、微服务通用技术、Kitex框架等方面讲解~ 链接:https://pan.quark.cn/s/d65337a0e60d

S32K144 CAN使用

S32K144是恩智浦半导体推出的一款高性能微控制器(MCU),主要针对汽车和高可靠性的工业应用。在汽车工业应用中使用CAN总线必不可少。 需要注意的是在ISO 11898(High Speed,速度在5kbps-1Mbps)中,隐形电平电压差在0附件…

收银机打印机相关知识 windows7 查看打印机名称--未来之窗智慧经营收银系统百科

一、名词解释 打印机型号,打印机厂家,打印机接口、打印机驱动,打印机名称 机器的机身都有,打印机品牌,型号 二、什么是打印机接口 2.1 usb接口 一般用在收银小票,结账单,水单 2.2 并口接口 …

RK3568平台开发系列讲解(文件系统篇)什么是 inode?

一、什么是 inode? 为了存储一个文件,除了本身的文件内容块,还需要一个地方来存储文件相关的元信息信息。承载这些文件元数据的数据结构就是 inode(index node),inode 包含了文件元信息,比如文件的所有者、权限、修改时间戳等。 可以使用 ls -i 查看一个文件的 inode 号…

java基础概念11-方法

一、什么是方法 方法(method)是程序中最小的执行单元。 方法中的程序,要不然就是一起执行,要不然就是一起不执行!!! 二、方法的定义 在Java中,方法定义的一般格式如下:…

牛客 河南萌新联赛2024第(四)场:河南理工大学 B题

比赛链接: 河南萌新联赛2024第(四)场:河南理工大学_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com) B题:小雷的神奇电脑 题目描述: 小雷有一台特殊的电脑,这台电…

搜维尔科技:如何使用 SenseGlove Nova 在其“CAVE”投影室中操纵虚拟物体

AVR 创建了一个创新的基于 PC 的多面沉浸式环境,参与者完全被虚拟图像和声音包围。 需要解决的挑战: 传统的 VR 系统通常缺乏逼真的触觉反馈,限制了用户的沉浸感。AVR Japan 旨在通过将触觉技术融入其 CAVE 系统来解决这一挑战,使…

【8-9月份唯一机械电气计算机主题的IEEE会议】第七届机电一体化与计算机技术工程国际学术会议(MCTE 2024,8月23-25)

由广东博士创新发展促进会、输变电装备技术全国重点实验室联合主办,重庆大学电气工程学院、AEIC学术交流中心协办的第七届机电一体化与计算机技术工程国际学术会议(MCTE 2024)将于2024年8月23-25日在中国广州隆重举行。 大会诚挚邀请您投递相…

学习日志8.7--Security Zone防火墙安全区域

安全区域实验拓扑开始之前先通过一台主机和防火墙相连,设置主机的IP地址和网关,开启防火墙设置防火墙接口g1/0/1的IP地址为192.168.1.254,将防火墙设置为主机的网关,尝试能不能用主机ping通防火墙。尝试之后,发现失败&…

蚂蚁CodeFuse代码大模型技术解析:基于全仓库上下文的代码补全

背景 2023年CodeFuse完成了百亿级别的代码大模型从0到1的预训练,配合指令微调、量化部署等一系列配套技术,成功将AI大模型能力应用到多个下游研发场景,助力生产提效。在众多下游产品中,CodeFuse代码补全插件直接触及研发过程中最…

性能测试趋势 2024

效率。其主要目标是确保软件满足性能要求并提供令人满意的用户体验。 有效的性能测试需要仔细的规划、真实的场景以及使用适当的工具来模拟真实世界的条件。定期进行性能测试有助于确保软件系统能够处理不同的工作负载并提供积极的用户体验。性能测试的未来正在受到技术发展的…

SSL证书配置

SSL证书配置 证书申请nginx 配置ssl证书 今天群友发现我的博客证书过期了,重新申请一个免费的部署一下 证书申请 点击创建证书 绑定对应的域名,选择快捷签发,点击提交审核 点击验证,如果购买的域名和服务器都在同一个账号下&…

WPF学习(7)- Control基类+ContentControl类(内容控件)+ButtonBase基类

前面给大家介绍完了WPF所有的布局控件,属性以及使用案例,从这里咱们就开始学下内容控件。 Control基类 Control是许多控件的基类。比如最常见的按钮(Button)、单选(RadioButton)、复选(CheckBox)、文本框…

AIGC大模型实践总结(非常详细)零基础入门到精通,收藏这一篇就够了

大模型浪潮席卷全球,在各行各业中的重要性愈发凸显,呈现出一股不可逆转的发展趋势。这一年本人所在业产技也在这一过程中持续探索和尝试AIGC。本文一方面是对AIGC实践的总结回顾,同时也是本人学习实践AIGC过程中一些笔记、心得分享。因个人能…

Linux云计算 |【第二阶段】CLUSTER-DAY4

主要内容: 块存储应用案例(快照、快照回滚、快照克隆)、分布式文件系统(文件系统的构成:inode和block,创建存储池实现inode和block)、对象存储(radosgw) 补充&#xff1…

C++ STL与string类

一 什么是STL? STL,全称是标准模板库(Standard Template Library),是C标准库的一部分。STL提供了一些常用的数据结构和算法,帮助开发者更方便、高效地编写代码。通过使用STL,开发者不需要重复造…

吴恩达机器学习笔记 三十九 协同过滤的TensorFlow实现

TensorFlow的一个优点:可以自动算出成本函数的导数 如上图,设 f( x ) wx,成本 J 为(wx - 1)^2,用GradientTape()这个函数,TensorFlow会记录计算成本J所需的操作序列,保存在 tape 中。 dJdw为自动计算出的导…

图片转文字怎么操作?教你几招图片转文字小妙招

在日常的工作学习中,我们每天可能会接触到大量的图片资料,无论是会议纪要、书籍扫描页、还是网络上的有用信息截图,如果能快速将这些图片中的文字提取出来,无疑将极大提升我们的工作效率。下面给大家分享几种能够将图片转换成文字…

AI学习记录 - 自注意力机制的计算流程图

过段时间解释一下,为啥这样子计算,研究这个自注意力花了不少时间,网上很多讲概念,但是没有具体的流程图和计算方式总结…

多线程 01:Java 多线程学习导航,线程简介,线程相关概念的整理

一、概述 记录时间 [20240807] 立秋 & 128 创作纪念日 本文是关于 Java 多线程学习的导航篇,总览了有关多线程学习的几个模块。简单介绍了一些与线程相关的基本概念,便于后续展开多线程的学习。 前置知识:Java 基础篇;Java 面…