Java 中的 Socket 编程入门教程

Socket 是网络通信的基础,用于在计算机之间建立连接并交换数据。本文将介绍 Java 中的 Socket 编程,包括其背景、工作原理、常见用法,以及如何实现一个简单的客户端和服务端通信。


Socket 的背景与工作原理

背景

  1. Socket 的定义
    Socket 是网络通信的端点,允许两个应用程序通过网络进行数据交换。

  2. Socket 的分类

* TCP Socket:基于传输控制协议 (TCP),提供可靠的、面向连接的通信。

* UDP Socket:基于用户数据报协议 (UDP),提供无连接的、快速但不可靠的通信。

  1. Socket 的核心作用

* 建立连接:通过 IP 地址和端口号标识通信端点。

* 数据传输:实现应用程序之间的消息发送和接收。

工作原理

  1. 服务器端

* 绑定地址和端口,监听客户端连接请求。

* 与客户端建立连接后,通过输入输出流交换数据。

  1. 客户端

* 向服务器发送连接请求。

* 建立连接后,进行数据传输。

总结:Socket 是应用层和传输层之间的桥梁,封装了复杂的底层网络通信逻辑,使开发者可以专注于数据传输和处理。


Socket 编程的关键 API

1. 服务端相关 API

  • ServerSocket:监听特定端口的客户端连接。

  • accept() :阻塞方法,等待并接受客户端连接。

  • getInputStream()   &  getOutputStream() :用于接收和发送数据。

2. 客户端相关 API

  • Socket:表示一个客户端到服务器的连接。

  • connect() :连接到指定服务器。

  • getInputStream()   &  getOutputStream() :与服务端交换数据。


示例:实现简单的客户端-服务端通信

以下示例展示了如何使用 Java 实现一个 TCP Socket 通信。

服务端代码


import java.io.*;

import java.net.*;




public class Server {

    public static void main(String[] args) {

        int port = 12345; // 服务端监听端口

        try (ServerSocket serverSocket = new ServerSocket(port)) {

            System.out.println("服务端已启动,等待客户端连接...");

            Socket socket = serverSocket.accept(); // 等待客户端连接




            // 获取输入输出流

            InputStream input = socket.getInputStream();

            BufferedReader reader = new BufferedReader(new InputStreamReader(input));

            OutputStream output = socket.getOutputStream();

            PrintWriter writer = new PrintWriter(output, true);




            // 接收客户端消息

            String message = reader.readLine();

            System.out.println("接收到客户端消息: " + message);




            // 向客户端发送响应

            writer.println("Hello, Client! 我是服务端。");




            socket.close();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}

客户端代码


import java.io.*;

import java.net.*;




public class Client {

    public static void main(String[] args) {

        String host = "localhost"; // 服务器地址

        int port = 12345; // 服务器端口

        try (Socket socket = new Socket(host, port)) {

            // 获取输入输出流

            OutputStream output = socket.getOutputStream();

            PrintWriter writer = new PrintWriter(output, true);

            InputStream input = socket.getInputStream();

            BufferedReader reader = new BufferedReader(new InputStreamReader(input));




            // 向服务端发送消息

            writer.println("Hello, Server! 我是客户端。");




            // 接收服务端响应

            String response = reader.readLine();

            System.out.println("接收到服务端响应: " + response);

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}


运行步骤

  1. 运行服务端程序 Server

* 服务端会在指定端口(12345)等待客户端连接。

  1. 运行客户端程序 Client

* 客户端会向服务端发送消息,并接收服务端响应。

运行结果:

  • 服务端:打印 接收到客户端消息: Hello, Server! 我是客户端。

  • 客户端:打印 接收到服务端响应: Hello, Client! 我是服务端。


Socket 编程的注意事项

  1. 端口管理

* 避免使用被占用的端口,常用端口号范围为 1024-49151。

  1. 多线程支持

* 服务端需要使用多线程来处理多个客户端连接。

  1. 异常处理

* 网络通信中可能出现超时、断开等异常,需要进行适当的处理。

  1. 资源释放

* 确保关闭 Socket 和流,避免资源泄漏。


进阶功能

  1. 多线程服务端

* 使用线程池处理多个客户端请求。

  1. 长连接与心跳检测

* 实现持续通信机制,监控连接状态。

  1. SSL/TLS 加密

* 提高数据传输的安全性。


总结

本文介绍了 Java 中的 Socket 编程基础,通过示例展示了如何实现简单的客户端和服务端通信。Socket 是网络编程的基础技能,在实现实时聊天、文件传输、网络爬虫等应用中发挥着重要作用。

若有疑问或进阶需求,欢迎在评论区留言交流!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自然语言处理技术之细粒度实体识别

细粒度实体识别(Fine-Grained Named Entity Recognition, FG-NER) 1. 概述 细粒度实体识别是自然语言处理(NLP)领域中的一个重要研究方向,其目标是从文本中识别出更加具体和详细的实体类型。相比于传统的实体识别(NER),细粒度实体识别不仅关注常见的实体类别(如 人名…

k8s 1.28.2 集群部署 docker registry 接入 MinIO 存储

文章目录 [toc]docker registry 部署生成 htpasswd 文件生成 secret 文件 生成 registry 配置文件创建 service创建 statefulset创建 ingress验证 docker registry docker registry 监控docker registry ui docker registry dockerfile docker registry 配置文件 S3 storage dr…

为什么要使用Ansible实现Linux管理自动化?

自动化和Linux系统管理 多年来,大多数系统管理和基础架构管理都依赖于通过图形或命令行用户界面执行的手动任务。系统管理员通常使用清单、其他文档或记忆的例程来执行标准任务。 这种方法容易出错。系统管理员很容易跳过某个步骤或在某个步骤上犯错误。验证这些步…

一文了解Android的核心系统服务

在 Android 系统中,核心系统服务(Core System Services)是应用和系统功能正常运行的基石。它们负责提供系统级的资源和操作支持,包含了从启动设备、管理进程到提供应用基础组件的方方面面。以下是 Android 中一些重要的核心系统服…

MATLAB向量元素的引用

我们定义一个向量后,如果想引用的话,可以通过索引 i n d ind ind来实现。 注意:MATLAB中向量的开始索引是1,与许多编程语言不同。 例如: 如果想引用多个的话,可以用索引 i n d ind ind来提取多个位置 例如…

让空间计算触手可及,VR手套何以点石成金?

引言 如何让一位母亲与她去世的小女儿“重逢”?韩国MBC电视台《I Met You》节目实现了一个“不可能”心愿。 在空旷的绿幕中,母亲Jang Ji-sung透过VR头显,看到了三年前因白血病去世的女儿Nayeon。当她伸出双手,居然能摸到女儿的…

paramiko 库实现的暴力破解 SSH 密码

import paramiko import optparse import threading import time from threading import Thread, BoundedSemaphore# 用paramiko暴力破解SSH密码 # 最大并发连接尝试的数量,可根据实际情况调整,适当减小可降低对目标服务器的压力以及减少多线程同步问题出…

用 Python 从零开始创建神经网络(五):损失函数(Loss Functions)计算网络误差

用损失函数(Loss Functions)计算网络误差 引言1. 分类交叉熵损失(Categorical Cross-Entropy Loss)2. 分类交叉熵损失类(The Categorical Cross-Entropy Loss Class)展示到目前为止的所有代码3. 准确率计算…

RabbitMQ的工作队列在Spring Boot中实现(详解常⽤的⼯作模式)

上文着重介绍RabbitMQ 七种工作模式介绍RabbitMQ 七种工作模式介绍_rabbitmq 工作模式-CSDN博客 本篇讲解如何在Spring环境下进⾏RabbitMQ的开发.(只演⽰部分常⽤的⼯作模式) 目录 引⼊依赖 一.工作队列模式 二.Publish/Subscribe(发布订阅模式) …

QWen2.5学习

配置环境 pip install transformers 记得更新一下:typing_extensions pip install --upgrade typing_extensions 安装modelscope modelscope/modelscope: ModelScope: bring the notion of Model-as-a-Service to life. 下载这个仓库的代码上传到服务器解压 推…

如何使用正则表达式验证域名

下面是一篇关于如何使用正则表达式验证域名的教程。 如何使用正则表达式验证域名 简介 域名是互联网上网站的地址,每个域名由多个标签(label)组成,标签之间用点 . 分隔。域名规则有很多细节,但基本要求是&#xff1a…

【MySQL】MySQL数据库入门:构建你的数据基石

🍑个人主页:Jupiter. 🚀 所属专栏:MySQL初阶探索:构建数据库基础 欢迎大家点赞收藏评论😊 目录 🦅数据库基础🐀什么是数据库🐏主流数据库🦆MySQL数据库的基本…

微信小程序之路由跳转传数据及接收

跳转并传id或者对象 1.home/index.wxml <!--点击goto方法 将spu_id传过去--> <view class"item" bind:tap"goto" data-id"{{item.spu_id}}"> 结果: 2.home/index.js goto(event){// 路由跳转页面,并把id传传过去//获取商品idlet i…

杰控通过 OPCproxy 获取数据发送到服务器

把数据从 杰控 取出来发到服务器 前提你在杰控中已经有变量了&#xff08;wincc 也适用&#xff09; 打开你的opcproxy 软件包 opcvarFile 添加变量 写文件就写到 了 opcproxy.ini中 这个文件里就是会读取到的数据 然后 opcproxy.exe发送到桌面快捷方式再考回来 &#…

【Mysql】Mysql函数(上)

1、概述 在Mysql中&#xff0c;为了提高代码重用性和隐藏实现细节&#xff0c;Mysql提供了很多函数。函数可以理解为封装好的模块代码。 2、分类 在Mysql中&#xff0c;函数非常多&#xff0c;主要可以分为以下几类&#xff1a; &#xff08;1&#xff09;聚合函数 &#xf…

MIT6.5840 Lab 1: MapReduce(6.824)

结果 介绍 在本实验中&#xff0c;您将构建一个MapReduce系统。您将实现一个调用应用程序Map和Reduce函数并处理文件读写的工作进程&#xff0c;以及一个将任务分发给工作进程并处理失败的工作进程的协调进程。您将构建类似于MapReduce论文的东西。&#xff08;注意&#xff1a…

关于mysql中的锁

mysql中包含的锁分为&#xff1a; 一、全局锁 二、表锁 三、行锁 一、全局锁 全局锁的力度是最大的&#xff0c;全局锁对整个数据库实例加锁&#xff0c;加锁后整个实例就处于只读状态&#xff0c;后续的DML的写语句&#xff0c;DDL语句&#xff0c;已经更新操作的事务提交语句…

51单片机应用开发---LCD1602显示应用

实现目标 1、了解LCD1602液晶屏&#xff1b; 2、掌握驱动程序的编写&#xff1b; 3. 具体目标&#xff1a;在屏幕上显示字符。 一、LCD1206概述 1.1 定义 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置…

Istio分布式链路监控搭建:Jaeger与Zipkin

分布式追踪定义 分布式追踪是一种用来跟踪分布式系统中请求的方法&#xff0c;它可以帮助用户更好地理解、控制和优化分布式系统。分布式追踪中用到了两个概念&#xff1a;TraceID 和 SpanID。 TraceID 是一个全局唯一的 ID&#xff0c;用来标识一个请求的追踪信息。一个请求…

编写一个生成凯撒密码的程序

plain list(input("请输入需要加密的明文&#xff08;只支持英文字母&#xff09;&#xff1a;"))key int(input("请输入移动的位数&#xff1a;"))base_A ord(A)base_a ord(a)cipher []for each in plain:if each :cipher.append( )else:if each.i…