socket基础学习以及java搭建

在 Java 中,Socket 编程用于实现网络通信。Java 提供了丰富的网络 API,使得通过 Socket 进行通信变得简单和高效。Java 的 Socket 编程常见于客户端-服务器应用中,比如聊天程序、文件传输工具等。

1. Socket 基本概念

Socket 编程的基本概念和之前提到的一样,Socket 是网络通信中的端点,由 IP 地址和端口号唯一确定。Java 的 java.net 包提供了 Socket 编程所需的类,常见的类包括:

  • Socket:客户端用来连接服务器的 Socket。
  • ServerSocket:服务器端监听客户端请求的 Socket。
  • InetAddress:表示 IP 地址。
  • SocketException:网络连接异常。

2. Socket 编程的基本流程

Socket 编程的流程通常包括以下几个步骤:

  • 服务器端创建 ServerSocket 对象,监听客户端连接。
  • 客户端创建 Socket 对象,连接到服务器。
  • 数据传输:客户端与服务器通过 InputStream 和 OutputStream 进行数据传输。
  • 关闭连接:通信结束后,客户端和服务器都需要关闭 Socket。

3. 基本代码示例

服务器端代码:
服务器端代码中,ServerSocket 用于监听客户端的连接请求,Socket 用于与客户端建立连接,进行数据的读写。

import java.io.*;
import java.net.*;public class Server {public static void main(String[] args) {try {// 创建一个 ServerSocket,绑定到特定端口ServerSocket serverSocket = new ServerSocket(12345);System.out.println("服务器启动,等待连接...");// 等待客户端连接Socket clientSocket = serverSocket.accept();System.out.println("客户端连接成功");// 获取输入流读取客户端发来的数据BufferedReader input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));String clientMessage = input.readLine();System.out.println("收到客户端的消息: " + clientMessage);// 向客户端发送响应消息PrintWriter output = new PrintWriter(clientSocket.getOutputStream(), true);output.println("Hello, Client!");// 关闭连接input.close();output.close();clientSocket.close();serverSocket.close();} catch (IOException e) {e.printStackTrace();}}
}

客户端代码:
客户端代码中,Socket 用于连接服务器,InputStream 和 OutputStream 用于数据的读取和写入。

import java.io.*;
import java.net.*;public class Client {public static void main(String[] args) {try {// 创建一个 Socket 连接到服务器Socket socket = new Socket("localhost", 12345);// 向服务器发送消息PrintWriter output = new PrintWriter(socket.getOutputStream(), true);output.println("Hello, Server!");// 获取服务器响应BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));String serverMessage = input.readLine();System.out.println("收到服务器的消息: " + serverMessage);// 关闭连接input.close();output.close();socket.close();} catch (IOException e) {e.printStackTrace();}}
}

4. 常用的 Socket 类

  • ServerSocket:用于服务器端监听客户端的连接请求。它提供了一个 accept() 方法,用于等待客户端连接。
  • Socket:客户端使用该类连接服务器,通过 getInputStream() 和 getOutputStream() 进行数据通信。
  • InetAddress:代表 IP 地址,可以通过该类获取本机或远程主机的 IP 地址。

5. 数据传输

在 Socket 编程中,数据的传输是通过流(流的概念与文件操作中的流类似)来实现的。常见的数据流类:

  • InputStream/OutputStream:用于字节流的数据传输。
  • BufferedReader/BufferedWriter:用于字符流的数据传输,通常比字节流更高效,适合处理文本数据。
    发送和接收数据的基本操作:
  • 使用 getOutputStream() 获取客户端或服务器的输出流,通过 PrintWriter 将数据发送给对方。
  • 使用 getInputStream() 获取客户端或服务器的输入流,通过 BufferedReader 读取接收到的数据。

6. 多线程处理多个客户端

通常,在实际应用中,服务器需要处理多个客户端的连接。为此,可以使用多线程来处理每个客户端的请求。

修改服务器端代码,支持多线程:

import java.io.*;
import java.net.*;public class Server {public static void main(String[] args) {try {// 创建一个 ServerSocket,绑定到特定端口ServerSocket serverSocket = new ServerSocket(12345);System.out.println("服务器启动,等待连接...");// 无限循环,接受多个客户端连接while (true) {Socket clientSocket = serverSocket.accept();System.out.println("客户端连接成功");// 为每个客户端创建一个线程处理new ClientHandler(clientSocket).start();}} catch (IOException e) {e.printStackTrace();}}
}// 处理每个客户端的线程
class ClientHandler extends Thread {private Socket socket;public ClientHandler(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {// 获取输入流读取客户端发来的数据BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));String clientMessage = input.readLine();System.out.println("收到客户端的消息: " + clientMessage);// 向客户端发送响应消息PrintWriter output = new PrintWriter(socket.getOutputStream(), true);output.println("Hello, Client!");// 关闭连接input.close();output.close();socket.close();} catch (IOException e) {e.printStackTrace();}}
}

7. 常见问题及调试

  • 端口被占用:如果服务器端的端口被占用,可以使用其他端口号。
  • 连接超时:如果连接无法建立,可能是服务器没有启动,或者防火墙阻止了连接。
  • EOFException:可能是连接中断或客户端没有发送预期的数据。
  • 异常处理:确保在网络通信过程中使用适当的异常处理机制,避免因为网络故障导致程序崩溃。

8. 进阶学习

  • UDP Socket:UDP 是一种无连接的协议,不需要建立连接即可发送数据。可以学习 Java 中如何使用 DatagramSocket
    和 DatagramPacket 实现 UDP 通信。
  • 非阻塞式 I/O:了解 Java NIO(New Input/Output)库,使用 Selector 进行非阻塞式的 I/O
    操作,适用于高并发应用。
  • SSL/TLS 加密:学习如何通过 Java 中的 SSLSocket 来进行安全的加密通信,保护数据传输的安全性。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多线程JUC(二)

目录 一、等待唤醒机制1.生产者消费者2.阻塞队列3.线程的状态 二、线程池1.理解与使用2.自定义线程池 三、线程池额外知识 一、等待唤醒机制 1.生产者消费者 等待唤醒机制可以简单的理解为下图。厨师相当于生产者,吃货相当于消费者。当桌子(缓冲区&…

【仿muduo库one thread one loop式并发服务器实现】

文章目录 一、项目介绍1-1、项目总体简介1-2、项目开发环境1-3、项目核心技术1-4、项目开发流程1-5、项目如何使用 二、框架设计2-1、功能模块划分2-1-1、SERVER模块2-1-2、协议模块 2-2、项目蓝图2-2-1、整体图2-2-2、模块关系图2-2-2-1、Connection 模块关系图2-2-2-2、Accep…

关于tresos Studio(EB)的MCAL配置之GPT

概念 GPT,全称General Purpose Timer,就是个通用定时器,取的名字奇怪了点。定时器是一定要的,要么提供给BSW去使用,要么提供给OS去使用。 配置 General GptDeinitApi控制接口Gpt_DeInit是否启用 GptEnableDisable…

STM32Cubemx配置E22-xxxT22D lora模块实现定点传输

文章目录 一、STM32Cubemx配置二、定点传输**什么是定点传输?****定点传输的特点****定点传输的工作方式****E22 模块定点传输配置****如何启用定点传输?****示例** **应用场景****总结** **配置 1:C0 00 07 00 02 04 62 00 17 40****解析** …

多线程-线程本地变量ThreadLocal

简介 ThreadLocal是线程本地变量,用于存储独属于线程的变量,这些变量可以在同一个线程内跨方法、跨类传递。每一个ThreadLocal对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数据,就需要使用多个ThreadLo…

Python练习(握手问题,进制转换,日期问题,位运算,求和)

一. 握手问题 代码实现 ans0for i in range(1,51):for j in range(i1,51):if i<7 and j<7:continueelse:ans 1print(ans) 这道题可以看成是50个人都握了手减去7个人没握手的次数 答案&#xff1a;1204 二.将十进制整数拆解 2.1门牌制作 代码实现 ans0for i in ra…

DeepSeek 角色设定与风格控制

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

网络原理--HTTP协议

http中文名为超文本传输协议&#xff0c;所谓“超文本”就是指传输范围超出了能在UTF8等码表上找到的字符的范围&#xff0c;包含一些图片&#xff0c;特殊格式之类的。 HTTP的发展简介 从图中可以看出到现在已经发展出了HTTP3&#xff0c;但是市面上的主流还是以HTTP1.0为主。…

学习工具的一天之(burp)

第一呢一定是先下载 【Java环境】&#xff1a;Java Downloads | Oracle 下来是burp的下载 Download Burp Suite Community Edition - PortSwigger 【下载方法二】关注的一个博主 【BurpSuite 安装激活使用详细上手教程 web安全测试工具】https://www.bilibili.com/video/BV…

Java后端高频面经——Mysql

3. Mysql(21) 第三范式的作用与原理&#xff1f;&#xff08;B站&#xff09; 数据库范式有 3 种&#xff1a; 1NF(第一范式)&#xff1a;属性不可再分。 1NF 是所有关系型数据库的最基本要求 &#xff0c;也就是说关系型数据库中创建的表一定满足第一范式。 2NF(第二范式)&am…

React:Router路由

ReactRouter引入 在index.js里编辑&#xff0c;创建路由&#xff0c;绑定路由 import React from react; import ReactDOM from react-dom/client; import ./index.css; import reportWebVitals from ./reportWebVitals; import { createBrowserRouter, RouterProvider } from…

什么是XSS

文章目录 前言1. 前端知识2. 什么是XSS3. 漏洞挖掘4. 参考 前言 之前对XSS的理解就是停留在弹窗&#xff0c;认为XSS这种漏洞真的是漏洞吗&#xff1f;安全学习了蛮久了&#xff0c;也应该对XSS有更进一步的认识了。 1. 前端知识 现代浏览器是一个高度复杂的软件系统&#xf…

字节跳动发布 Trae AI IDE!支持 DeepSeek R1 V3,AI 编程新时代来了!

3 月 3 日&#xff0c;字节跳动重磅发布国内首款 AI 原生集成开发环境&#xff08;AI IDE&#xff09;——Trae 国内版&#xff01; Trae 不只是一个传统的 IDE&#xff0c;它深度融合 AI&#xff0c;搭载 doubao-1.5-pro 大模型&#xff0c;同时支持DeepSeek R1 & V3&…

QT 作业 day4

作业 代码 Widget.h class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();private slots:// 槽函数void on_listWidget_itemDoubleClicked(QListWidgetItem *item);private:Ui::Widget *ui; }; #endif Widget.cpp Widget::Widget(QW…

新版 FMEA 七步法 - PFMEA 第2步“结构分析”的关键要点 | FMEA软件

基于AIAG & VDA FMEA七步法&#xff0c;在 PFMEA 第二步“结构分析”中&#xff0c;FMEA软件 CoreFMEA 总结了关键要点如下&#xff1a; 1. 明确分析目的与范围 界定边界&#xff1a;清晰确定要分析的制造系统边界&#xff0c;明确哪些过程、设备、人员等包含在分析范围内…

DeepSeek 助力 Vue3 开发:打造丝滑的时间选择器(Time Picker)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的时间选择器(Time Picker)📚前言📚页面效果📚指令输入…

Python-04BeautifulSoup网络爬虫

2025-03-04-BeautifulSoup网络爬虫 记录BeautifulSoup网络爬虫的核心知识点 文章目录 2025-03-04-BeautifulSoup网络爬虫 [toc]1-参考网址2-学习要点3-核心知识点1. 安装2. 导入必要的库3. 发送 HTTP 请求4. 创建 BeautifulSoup 对象5. 解析 HTML 内容5.1 查找标签5.2 根据属性…

[Windows] 多系统键鼠共享工具 轻松跨系统控制多台电脑

参考原文&#xff1a;[Windows] 多系统键鼠共享工具 轻松跨系统控制多台电脑 还在为多台电脑需要多套键盘鼠标而烦恼吗&#xff1f;是不是在操控 Windows、macOS、Linux 不同系统电脑时手忙脚乱&#xff1f;现在&#xff0c;这些问题通通能解决&#xff01;Deskflow 软件闪亮登…

docker学习笔记(1)从安装docker到使用Portainer部署容器

docker学习笔记第一课 先交代背景 docker宿主机系统&#xff1a;阿里云ubuntu22.04 开发机系统&#xff1a;win11 docker镜像仓库&#xff1a;阿里云&#xff0c;此阿里云与宿主机系统没有关系&#xff0c;是阿里云提供的一个免费的docker仓库 代码托管平台&#xff1a;github&…

Ollama 框架本地部署教程:开源定制,为AI 项目打造专属解决方案!

Ollama 是一款开源的本地大语言模型&#xff08;LLM&#xff09;运行框架&#xff0c;用于管理和运行语言模型。具有以下核心特点&#xff1a; 开源可定制&#xff1a;采用 MIT 开源协议&#xff0c;开发者能自由使用、阅读源码并定制&#xff0c;可根据自身需求进行功能扩展和…