编程自学指南:java程序设计开发,网络编程基础,TCP编程,UDP编程,HTTP客户端开发

编程自学指南:java程序设计开发,网络编程基础

学习目标

  1. 理解网络协议(TCP/IP、UDP)的核心概念

  2. 掌握Socket编程实现客户端与服务端通信

  3. 能够通过多线程处理并发网络请求

  4. 开发简单的网络应用(如聊天程序、文件传输工具)


一、课程引入

1.1 网络编程的应用场景

  • 实时通信:聊天软件、视频会议

  • 数据传输:文件下载、云存储

  • 远程控制:物联网设备管理、服务器监控

1.2 核心概念

  • IP地址:设备的唯一标识(如192.168.1.1

  • 端口号:应用程序的通信入口(0~65535)

  • TCP vs UDP

    • TCP:可靠传输(三次握手),如网页浏览、文件传输

    • UDP:高效但不可靠,如视频流、实时游戏


二、TCP编程

2.1 服务端开发步骤

  1. 创建ServerSocket监听端口

  2. 调用accept()等待客户端连接

  3. 通过输入输出流进行数据读写

  4. 关闭资源

案例1:服务端回声程序(Echo Server)
public class TCPServer {  public static void main(String[] args) throws IOException {  try (ServerSocket serverSocket = new ServerSocket(8888)) {  System.out.println("服务端启动,等待连接...");  Socket clientSocket = serverSocket.accept();  BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));  PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);  String inputLine;  while ((inputLine = in.readLine()) != null) {  System.out.println("收到客户端消息:" + inputLine);  out.println("【服务端响应】" + inputLine);  // 回声  }  }  }  
}

2.2 客户端开发步骤

  1. 创建Socket连接服务端

  2. 通过输入输出流通信

案例2:TCP客户端
public class TCPClient {  public static void main(String[] args) throws IOException {  try (Socket socket = new Socket("localhost", 8888)) {  PrintWriter out = new PrintWriter(socket.getOutputStream(), true);  BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));  BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));  String userInput;  while ((userInput = stdIn.readLine()) != null) {  out.println(userInput);  System.out.println("服务端回复:" + in.readLine());  }  }  }  
}

三、UDP编程

3.1 数据报通信(DatagramSocket)

案例3:UDP消息发送与接收
// 发送端  
public class UDPSender {  public static void main(String[] args) throws IOException {  DatagramSocket socket = new DatagramSocket();  byte[] data = "Hello UDP".getBytes();  DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("localhost"), 9999);  socket.send(packet);  socket.close();  }  
}  // 接收端  
public class UDPReceiver {  public static void main(String[] args) throws IOException {  DatagramSocket socket = new DatagramSocket(9999);  byte[] buffer = new byte[1024];  DatagramPacket packet = new DatagramPacket(buffer, buffer.length);  socket.receive(packet);  String msg = new String(packet.getData(), 0, packet.getLength());  System.out.println("收到消息:" + msg);  socket.close();  }  
}

四、HTTP客户端开发

4.1 使用HttpURLConnection

案例4:获取网页内容
public class HTTPClient {  public static void main(String[] args) throws IOException {  URL url = new URL("https://www.example.com");  HttpURLConnection conn = (HttpURLConnection) url.openConnection();  conn.setRequestMethod("GET");  try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {  String line;  while ((line = in.readLine()) != null) {  System.out.println(line);  }  }  }  
}

五、综合案例:多线程聊天室

5.1 服务端(支持多客户端)

public class ChatServer {  private static final List<Socket> clients = new ArrayList<>();  public static void main(String[] args) throws IOException {  ServerSocket serverSocket = new ServerSocket(8888);  System.out.println("聊天室服务端启动...");  while (true) {  Socket clientSocket = serverSocket.accept();  clients.add(clientSocket);  new Thread(() -> handleClient(clientSocket)).start();  }  }  private static void handleClient(Socket clientSocket) {  try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))) {  String msg;  while ((msg = in.readLine()) != null) {  System.out.println("广播消息:" + msg);  broadcast(msg, clientSocket);  }  } catch (IOException e) {  e.printStackTrace();  }  }  private static void broadcast(String msg, Socket sender) {  for (Socket client : clients) {  if (client != sender) {  try {  PrintWriter out = new PrintWriter(client.getOutputStream(), true);  out.println(msg);  } catch (IOException e) {  e.printStackTrace();  }  }  }  }  
}

5.2 客户端代码(参考案例2修改)

  • 每个客户端独立线程接收服务端广播消息


六、常见错误与最佳实践

6.1 常见错误

  • 错误1:端口被占用

    new ServerSocket(8888); // 若端口已被占用,抛出BindException

    错误2:未处理Socket超时

socket.setSoTimeout(5000); // 设置读取超时时间,避免无限等待

6.2 最佳实践

  1. 使用try-with-resources自动关闭Socket和流

  2. TCP场景选择

    • 需可靠传输 → TCP(如文件传输)

    • 需低延迟 → UDP(如实时游戏)

  3. 多线程优化:使用线程池(如ExecutorService)管理客户端连接


七、总结与练习

7.1 总结

  • TCP编程:可靠传输,需建立连接(三次握手)

  • UDP编程:高效但不可靠,适合实时场景

  • HTTP客户端:通过URLConnection访问Web服务

7.2 课后任务

  1. 实现一个TCP文件传输工具(客户端发送文件,服务端保存)

  2. 用UDP协议实现简单的时间服务器(客户端请求时间,服务端返回当前时间)

  3. 预习下一节课:反射与注解

7.3 扩展挑战

  • 基于WebSocket实现实时聊天程序(可借助Java EE或Spring框架)

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

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

相关文章

leecode797.所有可能的路径

深度优先搜索 class Solution { private:vector<vector<int>> result;vector<int> temp;void allPathsSourceTarget(vector<vector<int>> &graph,int v){if(vgraph.size()-1)result.push_back(temp);else{for(auto& adjVertex:graph[v]…

第八节:红黑树(初阶)

【本节要点】 红黑树概念红黑树性质红黑树结点定义红黑树结构红黑树插入操作的分析 一、红黑树的概念与性质 1.1 红黑树的概念 红黑树 &#xff0c;是一种 二叉搜索树 &#xff0c;但 在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是 Red和 Black 。 通过对 任何…

微信小程序threejs三维开发

微信小程序threejs开发 import * as THREE from three; const { performance, document, window, HTMLCanvasElement, requestAnimationFrame, cancelAnimationFrame, core, Event, Event0 } THREE .DHTML import Stats from three/examples/jsm/libs/stats.module.js; im…

jupyter无法转换为PDF,HTMLnbconvert failed: Pandoc wasn‘t found.

无法转为PDF 手动下载工具 https://github.com/jgm/pandoc/releases/tag/3.6.3 似乎跟我想的不大一样&#xff0c;还有新的报错 https://nbconvert.readthedocs.io/en/latest/install.html#installing-tex 不知道下的啥玩意儿 sudo apt-get install texlive-xetex texlive-fon…

关于PLC、电缆线材及气缸选型的详细教程

以下是关于PLC、电缆线材及气缸选型的详细教程&#xff0c;整合了多个专业来源的核心要点&#xff1a; 一、PLC选型要点 生产厂家选择 日系PLC&#xff08;如三菱FX系列、欧姆龙CP1系列&#xff09;适合独立设备或简单控制系统&#xff0c;性价比高。欧美系PLC&#xff08;如西…

使用 Excel 实现绩效看板的自动化

引言 在日常工作中&#xff0c;团队的绩效监控和管理是确保项目顺利进行的重要环节。然而&#xff0c;面临着以下问题&#xff1a; ​数据分散&#xff1a;系统中的数据难以汇总&#xff0c;缺乏一个宏观的团队执行情况视图。​看板缺失&#xff1a;系统本身可能无法提供合适…

02 windows qt配置ffmpeg开发环境搭建

版本说明 首先我使用ffmpeg版本是4.2.1 QT使用版本5.14.2 我选择是c编译 在02Day.pro⾥⾯添加ffmpeg头⽂件和库⽂件路径 win32 { INCLUDEPATH $$PWD/ffmpeg-4.2.1-win32-dev/include LIBS $$PWD/ffmpeg-4.2.1-win32-dev/lib/avformat.lib \$$PWD/ffmpeg-4.2.1-win32-dev/l…

Dask:Python高效并行计算利器

Dask&#xff1a;Python高效并行计算利器 Dask是一个开源的Python并行计算库&#xff0c;旨在扩展Python常用工具&#xff08;如NumPy、Pandas、Scikit-learn等&#xff09;的功能&#xff0c;使其能够处理更大规模的数据集和更复杂的计算任务。它通过动态任务调度和分布式计算…

掌握市场先机:9款销售渠道管理工具深度测评

本文主要介绍了以下9款销售渠道管理工具&#xff1a;1.纷享销客&#xff1b; 2.销帮帮&#xff1b; 3.小满CRM&#xff1b; 4.有赞&#xff1b; 5.Oracle NetSuite&#xff1b; 6.Salesforce Sales Cloud&#xff1b; 7.Cin7&#xff1b; 8.Pipedrive&#xff1b; 9.BigCommerc…

C语言基础知识04

指针 指针概念 指针保存地址&#xff0c;地址是字节的编号 指针类型和保存的地址类型要一直 使用时注意&#xff0c;把地址转换为&变量的格式来看 int a[3]; a转为&a[0] 指针的大小 64bit 固定8字节&#xff0c; 32bit 固定4字节 指针…

计算矩阵边缘元素之和(信息学奥赛一本通-1121)

【题目描述】 输入一个整数矩阵&#xff0c;计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素&#xff0c;就是第一行和最后一行的元素以及第一列和最后一列的元素。 【输入】 第一行分别为矩阵的行数m和列数n&#xff08;m<100&#xff0c;n<100&#xff09;&#xff0c…

异常(9)

大家好,今天我们来详细介绍一下异常抛出的知识,在编写程序时,如果程序中出现错误,此时就需要将错误的信息告知给调用者,话不多说,来看. 在java中,可以借助throw关键字,抛出一个指定的异常对象,将错误对象告知给调用者,具体语法如下&#xff1a; throw new xxx("异常产生…

网络安全就业形势

网络安全是一个日益增长的行业&#xff0c;对于打算进入或转行进入该领域的人来说&#xff0c;制定一个清晰且系统的职业规划非常重要。2025年&#xff0c;网络安全领域将继续发展并面临新的挑战&#xff0c;包括不断变化的技术、法规要求以及日益复杂的威胁环境。 第一部分&am…

3U VPX 国产化板卡FT6678+V7 690T

板卡1、 采用标准3U VPX架构&#xff0c;板上集成1片深圳国微电子SMQ7V690TFFG1761&#xff08;pin-to-pin兼容Xilinx的XC7VX690T-2FFG1761I&#xff09;FPGA&#xff0c;1片国防科大FT-M6678&#xff08;功能兼容TI的TMS320C6678&#xff09;&#xff0c;对外接口RS422、网口…

【数据结构】-哈夫曼树以及其应用

哈夫曼树&#xff08;Huffman Tree&#xff09; 1. 哈夫曼树的定义 哈夫曼树&#xff08;Huffman Tree&#xff09;是一种 带权路径长度最短的二叉树&#xff0c;常用于数据压缩和最优前缀编码。其目标是使得 带权路径长度&#xff08;WPL&#xff09;最小。 在信息论和计算…

Linux 命名管道

文章目录 &#x1f680; 深入理解命名管道&#xff08;FIFO&#xff09;及其C实现一、命名管道核心特性1.1 &#x1f9e9; 基本概念 二、&#x1f4bb; 代码实现解析2.1 &#x1f4c1; 公共头文件&#xff08;common.hpp&#xff09;2.2 &#x1f5a5;️ 服务器端&#xff08;s…

sap 内存管理与数据共享方式

SAP内存管理 内存是程序之间为了传递数据而使用的共享存储空间 SAP内存分类&#xff1a;1、SAP内存&#xff0c;2、ABAP内存 这两种内存都是针对同一登录用户实现数据共享。 SAP内存&#xff08;SAP Memory&#xff09;和ABAP内存&#xff08;ABAP Memory&#xff09;&…

数据结构与算法(哈希表——两个数组的交集)

原题 349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09; 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 […

python笔记2

变量&#xff1a;含义 一个容器&#xff0c;计算机当中的存储空间。 可以理解为一个用于标识或引用数据的名字或标签。 作用&#xff1a; 可以通过定义一个变量来给需要使用多次的数据命名&#xff0c;就像一个标签一样。下次需要使用这个数据时&#xff0c;只需要通过这个变…

【Linux系统编程】信号

目录 1、信号1.1、什么是信号1.2、进程对信号的处理1.3、信号的生命周期1.4、信号处理流程1.5、信号的发送 2、kill()、raise()函数 发送信号3、alarm函数 闹钟信号4、pause函数 挂起信号、暂停5、singal 函数 捕获信号5.1、为什么返回值是上一次的处理方式5.2、练习 6、sigact…