Java网络编程 TCP通信(Socket 与 ServerSocket)

news2024/9/22 17:37:25

1.TCP通信原理

TCP通信涉及两个端点:客户端和服务器。服务器端使用 ServerSocket 监听特定端口,等待客户端的连接请求。客户端使用 Socket 连接到服务器的IP地址和端口。一旦连接建立,双方就可以通过输入输出流进行数据交换.

ServerSocket是等待客户端的请求,一旦获得一个连接请求,就创建一个Socket示例来与客户端进行通信。 

2.Socket和ServerSocket

ServerSocket

ServerSocket 类用于服务器端,用于监听来自客户端的连接请求。以下是创建 ServerSocket 的基本步骤:

  1. 创建 ServerSocket 实例并指定端口号。
  2. 调用 accept() 方法等待客户端连接。
  3. 接收客户端的 Socket 对象。
  4. 使用输入输出流与客户端进行通信。

Socket

Socket 类用于客户端,用于连接到服务器并发送/接收数据。以下是使用 Socket 的基本步骤:

  1. 创建 Socket 实例并指定服务器的IP地址和端口号。
  2. 连接到服务器。
  3. 使用输入输出流发送和接收数据。
  4. 关闭连接。

 3.演示

服务器端代码

public class TcpServer {
    public static void main(String[] args) {
        int port = 12345;
        try (ServerSocket serverSocket = new ServerSocket(port)) {
            System.out.println("服务器启动,等待客户端连接...");

            Socket clientSocket = serverSocket.accept();
            System.out.println("客户端已连接");

            InputStream input = clientSocket.getInputStream();
            OutputStream output = clientSocket.getOutputStream();

            // 读取客户端发送的数据
            byte[] buffer = new byte[1024];
            int bytesRead = input.read(buffer);
            System.out.println("来自客户端的消息: " + new String(buffer, 0, bytesRead));

            // 向客户端发送响应
            output.write("服务器已收到消息".getBytes());
            output.flush();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端代码

public class TcpClient {
    public static void main(String[] args) {
        String host = "127.0.0.1";
        int port = 12345;
        try (Socket socket = new Socket(host, port)) {
            System.out.println("连接到服务器...");

            OutputStream output = socket.getOutputStream();
            String message = "你好,服务器!";
            output.write(message.getBytes());
            output.flush();

            System.out.println("消息已发送");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

TCP通信的基本概念

  1. 面向连接:TCP通信在数据传输之前需要建立连接,通过三次握手过程。
  2. 可靠性:TCP通过序列号、确认应答、重传机制等确保数据的可靠传输。
  3. 流量控制:TCP使用窗口机制来控制发送方的发送速率,防止接收方来不及处理。
  4. 拥塞控制:TCP通过慢启动、拥塞避免、快速重传和快速恢复等算法来控制网络拥塞。

TCP和UDP的比较

  1. 连接性:TCP是面向连接的,而UDP是无连接的。
  2. 速度:TCP由于需要建立连接和保证数据完整性,速度较慢;UDP速度快,但可靠性较低。
  3. 适用场景:TCP适用于需要可靠传输的场景,如文件传输、邮件传输等;UDP适用于对速度要求高的场景,如实时视频、在线游戏等。

Java中的TCP通信

  1. ServerSocket:服务器端使用ServerSocket来监听客户端的连接请求。
  2. Socket:客户端使用Socket来连接服务器,并进行数据传输。
  3. 输入输出流Socket提供输入流和输出流来进行数据的读取和发送。
  4. 多线程:为了同时处理多个客户端,服务器端通常需要使用多线程。

TCP通信的典型应用

  1. Web服务器:HTTP协议基于TCP,用于客户端和服务器之间的数据传输。
  2. 数据库连接:数据库客户端通过TCP与服务器进行通信。
  3. 文件传输:FTP(文件传输协议)使用TCP来保证文件传输的可靠性。

TCP编程的注意事项

  1. 异常处理:网络编程中需要妥善处理各种网络异常。
  2. 资源管理:确保及时关闭Socket连接和流,释放系统资源。
  3. 安全性:考虑使用加密和认证机制来保护数据传输的安全。

 

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

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

相关文章

PHP泛目录生成源码,可生成长尾关键词页面,带使用方法视频教程

介绍: 真正的好东西,搞网站优化seo从业必备。可以快速提升网站权重,带来的流量哗哗的 PHP泛目录生成源码 可生成新闻页面和关键词页面 带使用方法视频教程 泛目录可以用来提升网站收录和排名 合理运用目录可以达到快速出词和出权重的效果…

福建科立讯通信 指挥调度管理平台 SQL注入漏洞

北峰通信-福建科立讯通信 指挥调度管理平台 SQL注入漏洞 厂商域名和信息收集 域名: 工具sqlmap python sqlmap.py -u "http://ip:端口/api/client/down_file.php?uuid1" --batch 数据包 GET /api/client/down_file.php?uuid1%27%20AND%20(SELECT%20…

MYSQL基础-多表操作-事务-索引

1. 多表设计 概述 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种: …

云计算服务的底层,虚拟化技术的实现原理

虚拟化技术: 一、 从cpu说起, intel和amd等cpu制造商 为了提高其cpu对 虚拟化程序的运算速度, 给cpu硬件里面 增加了指令集 VMLAUNCH, VMRESUME, VMEXIT, VMXOFF 这些指令集称为硬件辅助虚拟化技术的指令集。 ---------------------…

探索Python的Excel世界:openpyxl的魔法之旅

文章目录 探索Python的Excel世界:openpyxl的魔法之旅背景:为什么选择openpyxl?什么是openpyxl?如何安装openpyxl?简单的库函数使用方法场景应用:openpyxl在实际工作中的应用常见bug及解决方案总结 探索Pyth…

倒序循环(一)

题目描述 输入一个正整数n,输出从 n~ 1 递减的序列。 输入格式 一行一个整数 n 输出格式 n 行,每行一个符合题目要求的整数 样例数据 样例输入#1 5样例输出#1 5 4 3 2 1样例输入#2 6样例输出#2 6 5 4 3 2 1数据范围 对于100%的数据&#xff…

(c++)用取模符%、除运算判断是否是某个数的倍数,判断个位十位是否有某个数

结果易懂&#xff0c;但凡和7有关&#xff0c;都输出相应的关系。关系分为三种&#xff0c;7的倍数&#xff0c;十位是7&#xff0c;个位是7 #include<iostream>using namespace std;int main() {for (int num 1; num < 100; num){if (num % 7 0)//是7的倍数{cout …

51单片机快速入门之按键应用拓展

51单片机快速入门之按键应用拓展 LED的点动控制: 循环检测,当key 为0 时 led 亮 反之为熄灭 while(1){ if(key!1) { led0; }else { led1; } } LED的锁定控制: 当按钮按下,led取反值 while(1) { if(key!1) { led!led; } } LED的4路抢答控制: bz默认为0 !bz 取反值,循环启动…

git快熟

Git版本控制 内容背景集中式与分布式版本控制安装git代码托管服务Git必要配置公钥和私钥注册gitee配置ssh公钥实现远程仓库与本地仓库免密登录git常用命令git|全局设置获取git仓库工作区&#xff0c;暂存区&#xff0c;版本库 概念本地仓库操作远程仓库提交git分支操作idea集成…

<Linux> 进程间通信

目录 一、进程间通信介绍 1. 进程间通信概念 2. 进程间通信目的 3. 进程间通信的本质 4. 进程间通信发展 5. 进程间通信分类 管道&#xff08;文件缓冲区&#xff09; System V IPC POSIX IPC 二、管道 1. 匿名管道 1.1 匿名管道原理 1.2 pipe系统调用 1.3 匿名管道的使用 1.4…

vue3 透传 Attributes

前言 Vue 3 现在正式支持了多根节点的组件&#xff0c;也就是片段&#xff01; Vue 2.x 遵循单根节点组件的规则&#xff0c;即一个组件的模板必须有且仅有一个根元素。 为了满足单根节点的要求&#xff0c;开发者会将原本多根节点的内容包裹在一个<div>元素中&#x…

【MySQL】基础部分——DDL,DML,DQL,DCL,函数,约束,多表查询,事务

个人学习记录&#xff0c;供以后回顾和复习 ubuntu下安装使用1.DDL&#xff0c;DML&#xff0c;DQL&#xff0c;DCLDDL数据库表 DML增改删 DQL条件查询分组查询排序查询分页查询 DCL管理用户权限控制 2.函数字符串函数数值函数日期函数流程函数 3.约束4.多表查询多表关系内连接…

学习大数据DAY58 增量抽取数据表

作业 1 SQL 优化的常见写法有哪些 - 面试经常被问 使用索引&#xff1a;合理创建和使用索引是提高查询效率的关键。索引可以加速数据的检 索速度&#xff0c;但是索引也会占用额外的存储空间&#xff0c;并且在插入、删除和更新操作时会 有额外的开销。 避免全表扫描&…

Git+Jenkins 基本使用(Basic Usage of Git+Jenkins)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

Linux命令分享 四 (ubuntu 16.04)(vi操作文件)

1、su 切换用户 su - 用户名 切换到该用户并将目录切换至该用户的主目录 **注意该语句执行后需要输入密码&#xff0c;输入密码时终端不回显&#xff08;不会显示你输入的密码&#xff09;&#xff0c;输完直接回车即可 su 用户名 切换用户但不切换目录 su - root su root **注…

你可能遗漏的一些C#/.NET/.NET Core知识点

前言 在这个快速发展的技术世界中&#xff0c;时常会有一些重要的知识点、信息或细节被忽略或遗漏。《C#/.NET/.NET Core拾遗补漏》专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节&#xff0c;以帮助大家更全面地了解这些技术栈的特性和发展方向。 拾遗补漏Git…

NISP 一级 | 5.3 电子邮件安全

关注这个证书的其他相关笔记&#xff1a;NISP 一级 —— 考证笔记合集-CSDN博客 0x01&#xff1a;电子邮件安全威胁 电子邮件&#xff08;Electronic mail&#xff0c;Email&#xff09;是一种用电子手段提供信息交换的服务方式&#xff0c;是因特网上应用最为广泛的服务之一。…

【原创 架构设计】多级缓存的应用、常见问题与解决方式

1. 简介 多级缓存是一种常见的性能优化手段&#xff0c;对于多级缓存一般意义上的理解具体主要实现其实指的就是本地缓存和分布式缓存。 本地缓存一般采用Caffeine或者Guava Cache来进行实现&#xff0c;而分布式缓存一般采用Redis来进行实现。 2. 业务流程 业务线程先在本…

聚类_K均值

import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_blobs1.数据预处理 #创建基于高斯分布的样本点, x是点的坐标&#xff0c;y是所属聚类值 x, y make_blobs(n_samples100, centers6, random_state100, cluster_std0.6) # 设置图形尺寸…

整数在内存中的存储原码反码补码

目录 1.整数在内存中以二进制的形式存在 1.1&#xff08;正数存储情况&#xff09; 1.2 负数存储情况 1.3整数的补码如何得到原码 2.无符号整数的原反补码 小心&#xff01;VS2022不可直接接触&#xff0c;否则&#xff01;没这个必要&#xff0c;方源面色淡然一把抓住&am…