TCP协议程序设计
文章目录
- 前言
- 一、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地址上等待客户的连接请求。 */
我们输入的端口值,就是设定该服务器的接入端口,任何客户机都需要使用这个端口值才能申请接入此服务器。
| 方法 | 功能描述 | 返回类型 |
| 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对象的创建方法,其中第一个最常使用。
| 方法 | 功能描述 | 返回类型 |
| 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程序在开发应用程序,搭建网站,尤其对于网络通信提供了大量快速便捷的的函数和方法。如果有补充或者指正的内容,欢迎读者在评论区中留言。
相关文章:
TCP协议程序设计
文章目录 前言一、TCP协议程序是什么?二、使用步骤 1.服务器端与客户端2.实操展示总结 前言 TCP网络程序设计是指利用Socket类编写通信程序。利用TCP协议进行通讯的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序&…...
【C++高阶】:自定义删除器的全面探索
✨ 我凌于山壑万里,一生自由随风起 🌏 📃个人主页:island1314 🔥个人专栏:C学习 🚀 欢迎关注:👍点赞 👂&am…...
Java中的不可变集合、Stream流以及异常处理的
目录 1. 不可变集合 如何创建不可变集合 2. Stream流 Stream基本操作 3. 异常处理 异常的分类 异常处理机制 1. 不可变集合 在Java中,不可变集合指的是一旦创建后内容不可更改的集合。这种集合的好处在于它们可以安全地被多个线程访问而无需同步,…...
LeetCode面试题Day1|LeetCode26 删除有序数组中的重复项、LeetCode80 删除有序数组中的重复项Ⅱ
前言: 暑假实在不知道干什么了,做一下力扣的《面试经典150题》吧,记录一下学习轨迹。(如果有要打非中文竞赛或者精进一下英语水平的记得把力扣调成英文) 题目1: 指路: . - 力扣(LeetCode)26…...
细说文件操作
你好!感谢支持孔乙己的新作,本文就文件操作与大家分享我的思路。 希望能大佬们多多纠正及支持 !!! 个人主页:爱摸鱼的孔乙己-CSDN博客 目录 1.什么是文件 1.1.程序设计文件 1.1.1.程序文件 1.1.2.数据文…...
Vue3从零开始——掌握setup、ref和reactive函数的奥秘
文章目录 一、Vue 3 组合式 API 概述二、setup 函数的基本使用2.1 setup 函数的特点2.2 setup 函数的基本结构2.3 实现一个简单的小demo 三、ref 函数的功能和应用3.1 ref函数介绍3.2 基本使用3.2.1 定义ref数据3.2.2 修改响应式变量 3.3 使用ref函数实现计数器 …...
C语言练习--屏幕上打印九九乘法表
int main() { int i 0; for (i 1; i < 10; i) { int j 0; for (j 1; j <i; j) { printf(" %d*%d%2d", i, j, i * j); } printf("\n"); } return 0; }...
将tsx引入vue
按钮 vue <cl-batch-btn >新增批量</cl-batch-btn> import batch from "//modules/ad/components/ uploading/batch.vue" import ClBatchBtn from "/~/crud/src/components/batch-btn"; tsx...
前端实现签字效果+合同展示
文章目录 获取一个高度会变的元素的高度获取元素设置的 transform适配手机transform-origin: 5% 0; 的原因修改后 签字效果取消el-dialog的头部边距为什么禁止界面滚动vue3 使用 nextTick实现效果 签字判断是横是竖canvas 去掉空白部分canvas裁剪图片最终完善代码,可…...
[AI Embedchain] 开始使用 - 快速开始
安装 首先安装 Python 包: pip install embedchain安装包后,根据您的偏好,您可以选择使用以下内容: 开源模型 本节提供了一个快速入门示例,展示了如何使用 Mistral 作为开源 LLM(大型语言模型ÿ…...
Linux网络协议.之 tcp,udp,socket网络编程(三).之多进程实现并发demon
一、fork创建进程,来实现多并发 这只是个demon,并不能用于实际项目,多进程,消耗太多资源。没有人这么玩 1、服务端代码: #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #in…...
Java线程(练习题)
Exercise 创建三个线程:一个线程打印 100个A,一个线程打印 100 个 B ,一个线程打印 100个C 输出效果:ABC ABC ABC…交替打印 package com.kane.exercise01;public class PrintABC implements Runnable {private static final Object lock …...
MySQL:初识数据库初识SQL建库
目录 1、初识数据库 1.1 什么是数据库 1.2 什么是MySQL 2、数据库 2.1 数据库服务&数据库 2.2 C/S架构 3、 初识SQL 3.1 什么是SQL 3.2 SQL分类 4、使用SQL 4.1 查看所有数据库 4.1.2 语句解析 4.2 创建数据库 4.2.1 if not exists校验 4.2.2 手动明确字符集…...
关于Redis的集群面试题
问题一:Redis的多数据库机制,了解多少? Redis支持多个数据库,并且每个数据库是隔离的不能共享,单机下的redis可以支持16个数据库(db0~db15);若在Redis Cluster集群架构下,则只有一个…...
带头双向循环链表(一)
今天我们来学习带头双向链表 带头双向循环链表的解释 带头双向链表顾名思义就是: 1、带了一个“头”在数据结构中的意思就是加了一个"哨兵位"。 2、这个链表是双向循环的链表即可以通过任意的节点访问它的上一个和下一个的节点也能通过链表的头直接访…...
深入理解Win32K.sys的工作原理
https://download.csdn.net/download/sitelist/89621815 Windows Resource Kits 2003.rar工具下载,因为有windows server 2003源代码,并可以编译成iso,所以对于研究windows系统很有帮助,上吗是2003的研究工具,不知道源…...
力扣面试经典算法150题:删除有序数组中的重复项
删除有序数组中的重复项 今天的题目是力扣面试经典150题中的数组的简单题: 删除有序数组中的重复项 题目链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 给定一…...
文本加密工具类-支持MD5、SHA1、SHA256、SHA224、SHA512、SHA384、SHA3、RIPMD160算法
文本加密工具类 1.算法简介1.1 MD51.2 SHA-11.3 SHA-2(推荐使用)1.4 SHA-3(推荐使用)1.5 RIPEMD-160 2.工具类案例2.1POM导入2.2代码编写2.3 输出示例 1.算法简介 1.1 MD5 MD5 (Message-Digest Algorithm 5) 描述:M…...
LVS集群中的负载均衡技术
目录 一、LVS技术原理 二、NAT模式原理及部署方法 1、工作原理 2、部署方法 1、网络配置 2、软件安装与启用 3、测试 三、DR模式原理及部署方法 1、工作原理 2、部署方法 1、网络配置 2、解决vip响应问题 3、测试 四、ipvsadm命令及参数 1、管理集群服务&#x…...
Java网络编程——HTTP协议原理
协议 我们在网上冲浪时,会在浏览器地址栏输入一个网址,然后就能打开网页了。比如,输入 https://www.douban.com/就可以访问到豆瓣的主页: 那么大家是否好奇:https 是什么意思,作用又是什么呢?…...
终极指南:SeetaFaceEngine未来展望与人脸识别技术发展趋势分析
终极指南:SeetaFaceEngine未来展望与人脸识别技术发展趋势分析 【免费下载链接】SeetaFaceEngine 项目地址: https://gitcode.com/gh_mirrors/se/SeetaFaceEngine SeetaFaceEngine作为开源人脸识别引擎的标杆,为开发者提供了从人脸检测、关键点定…...
OpenClaw内存优化:在16G设备上高效运行Qwen3-32B任务的技巧
OpenClaw内存优化:在16G设备上高效运行Qwen3-32B任务的技巧 1. 为什么需要内存优化? 去年冬天,当我第一次尝试在16G内存的MacBook Pro上运行Qwen3-32B模型时,系统几乎立刻崩溃。这让我意识到,想要在资源有限的设备上…...
从安装到出图:Anything V5 Stable Diffusion 完整入门流程详解
从安装到出图:Anything V5 Stable Diffusion 完整入门流程详解 1. 环境准备与快速部署 1.1 系统要求 在开始使用Anything V5之前,请确保您的系统满足以下最低配置要求: 操作系统:Linux (推荐Ubuntu 20.04)GPU:NVID…...
从零配置上网行为管理:H3C AC本地认证与第三方AAA服务器切换指南
从零构建企业级网络认证体系:H3C AC与第三方AAA服务器实战解析 在数字化转型浪潮中,企业网络管理正面临前所未有的复杂挑战。当新员工入职第一天无法连接Wi-Fi,当市场部反映视频会议频繁卡顿,当IT部门发现内网存在异常流量却无法追…...
OpenClaw自动化测试实践:Qwen3.5-9B驱动日志分析与报告生成
OpenClaw自动化测试实践:Qwen3.5-9B驱动日志分析与报告生成 1. 为什么选择OpenClawQwen3.5做测试分析? 去年参与的一个物联网项目让我吃尽了测试日志的苦头——每天要手动分析近千条设备日志,从中筛选异常模式、统计错误类型、整理测试报告…...
嵌入式Linux按键驱动:除了轮询,你更应该掌握的3种高效方式(poll/中断/异步通知实战)
嵌入式Linux按键驱动开发:超越轮询的三种高效方案实战解析 在资源受限的嵌入式设备中,物理按键的处理往往成为影响系统响应速度和功耗的关键因素。传统轮询方式虽然实现简单,但在智能家居面板、手持设备等场景下,其CPU占用率高、响…...
掌握Blender 3MF插件:5大核心场景的全流程解决方案
掌握Blender 3MF插件:5大核心场景的全流程解决方案 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat Blender 3MF插件作为连接3D建模与3D打印的关键桥梁&#x…...
OpenClaw技能开发入门:为Qwen2.5-VL-7B扩展截图分析功能
OpenClaw技能开发入门:为Qwen2.5-VL-7B扩展截图分析功能 1. 为什么需要截图分析技能 上周我在整理项目文档时,突然意识到一个痛点:每次截图后都需要手动添加文字说明,这个过程既耗时又容易出错。作为一个长期关注自动化工具的技…...
2026 AI行业封神之年:国产模型反超海外,AI短剧/视频/编程三大赛道掘金指南
2026年,AI行业正式迈入工业化落地的关键拐点,不再是技术圈的自嗨,而是全面渗透进写作、设计、影视、开发的各行各业。想抓住这波时代红利,又不想在数十个平台间反复横跳?https://n.kulaai.cn 给出了最优解——这个一站式AI模型聚合平台,直接把ChatGPT、Claude、Gemini、D…...
seo外包公司报价高的原因是什么_如何比较不同seo外包公司的报价
SEO外包公司报价高的原因是什么_如何比较不同SEO外包公司的报价 在当今竞争激烈的市场环境中,越来越多的企业选择外包SEO服务来提升他们的在线存在感和业务增长。不同的SEO外包公司报价差异巨大,一些公司的报价显得格外高。SEO外包公司报价高的原因究竟…...
