Day(22)--网络编程习题

习题

以下是这些 TCP 通信练习题的 Java 代码实现及解析:

TCP 通信练习 1 - 多发多收

客户端(Client1.java)

java

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
​
public class Client1 {public static void main(String[] args) {try (Socket socket = new Socket("localhost", 8888)) {OutputStream os = socket.getOutputStream();String[] messages = {"Hello", "World", "Java"};for (String message : messages) {os.write(message.getBytes());os.flush();}} catch (IOException e) {e.printStackTrace();}}
}
服务器(Server1.java)

java

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
​
public class Server1 {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(8888);Socket socket = serverSocket.accept();InputStream is = socket.getInputStream()) {byte[] buffer = new byte[1024];int len;while ((len = is.read(buffer)) != -1) {String message = new String(buffer, 0, len);System.out.println("收到客户端消息: " + message);}} catch (IOException e) {e.printStackTrace();}}
}

解析

  • 客户端:创建 Socket 连接到本地主机的 8888 端口,获取输出流,循环发送多个字符串消息。

  • 服务器:创建 ServerSocket 监听 8888 端口,接受客户端连接后获取输入流,通过循环读取输入流数据,直到没有数据可读,打印接收到的消息。

TCP 通信练习 2 - 接收和反馈

客户端(Client2.java)

java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
​
public class Client2 {public static void main(String[] args) {try (Socket socket = new Socket("localhost", 8888)) {OutputStream os = socket.getOutputStream();os.write("你好".getBytes());os.flush();
​InputStream is = socket.getInputStream();byte[] buffer = new byte[1024];int len = is.read(buffer);String feedback = new String(buffer, 0, len);System.out.println("收到服务器反馈: " + feedback);} catch (IOException e) {e.printStackTrace();}}
}
服务器(Server2.java)

java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
​
public class Server2 {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(8888);Socket socket = serverSocket.accept();InputStream is = socket.getInputStream();OutputStream os = socket.getOutputStream()) {byte[] buffer = new byte[1024];int len = is.read(buffer);String message = new String(buffer, 0, len);System.out.println("收到客户端消息: " + message);
​os.write("已收到".getBytes());os.flush();} catch (IOException e) {e.printStackTrace();}}
}

解析

  • 客户端:连接到服务器,发送一条消息后,等待接收服务器反馈并打印。

  • 服务器:接受客户端连接,读取客户端发送的消息并打印,然后向客户端发送反馈消息。

TCP 通信练习 3 - 上传文件

客户端(Client3.java)

java

import java.io.*;
import java.net.Socket;
​
public class Client3 {public static void main(String[] args) {try (Socket socket = new Socket("localhost", 8888);FileInputStream fis = new FileInputStream("test.txt");OutputStream os = socket.getOutputStream()) {byte[] buffer = new byte[1024];int len;while ((len = fis.read(buffer)) != -1) {os.write(buffer, 0, len);}socket.shutdownOutput();
​InputStream is = socket.getInputStream();byte[] feedbackBuffer = new byte[1024];int feedbackLen = is.read(feedbackBuffer);String feedback = new String(feedbackBuffer, 0, feedbackLen);System.out.println(feedback);} catch (IOException e) {e.printStackTrace();}}
}
服务器(Server3.java)

java

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
​
public class Server3 {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(8888);Socket socket = serverSocket.accept();InputStream is = socket.getInputStream();FileOutputStream fos = new FileOutputStream("received.txt")) {byte[] buffer = new byte[1024];int len;while ((len = is.read(buffer)) != -1) {fos.write(buffer, 0, len);}OutputStream os = socket.getOutputStream();os.write("文件上传成功".getBytes());os.flush();} catch (IOException e) {e.printStackTrace();}}
}

解析

  • 客户端:连接服务器,读取本地文件并通过 Socket 输出流发送给服务器,发送完毕后关闭输出流,然后接收服务器反馈。

  • 服务器:监听端口接受连接,通过输入流读取客户端发送的数据写入新文件,文件接收完毕后向客户端发送反馈。

TCP 通信练习 4 - 上传文件(文件名重复问题)

解决方案思路

在服务器端接收文件时,检查文件名是否已存在,如果存在可以在文件名后添加序号或时间戳等方式进行重命名。以下是简单示例代码在 Server3 基础上修改:

java

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
​
public class Server4 {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(8888);Socket socket = serverSocket.accept();InputStream is = socket.getInputStream()) {String fileName = "received.txt";File file = new File(fileName);int count = 1;while (file.exists()) {String filePrefix = fileName.substring(0, fileName.lastIndexOf('.'));String fileSuffix = fileName.substring(fileName.lastIndexOf('.'));fileName = filePrefix + "(" + count + ")" + fileSuffix;file = new File(fileName);count++;}try (FileOutputStream fos = new FileOutputStream(file)) {byte[] buffer = new byte[1024];int len;while ((len = is.read(buffer)) != -1) {fos.write(buffer, 0, len);}OutputStream os = socket.getOutputStream();os.write("文件上传成功".getBytes());os.flush();}} catch (IOException e) {e.printStackTrace();}}
}

解析:在服务器接收文件前,先检查文件名是否存在,若存在则通过添加序号的方式生成新文件名,再进行文件接收操作。

TCP 通信练习 5 - 上传文件(多线程版)

服务器(Server5.java)

java

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
​
public class Server5 {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(8888)) {while (true) {Socket socket = serverSocket.accept();new Thread(() -> {try (InputStream is = socket.getInputStream();FileOutputStream fos = new FileOutputStream("received_" + System.currentTimeMillis() + ".txt")) {byte[] buffer = new byte[1024];int len;while ((len = is.read(buffer)) != -1) {fos.write(buffer, 0, len);}System.out.println("文件接收成功");} catch (IOException e) {e.printStackTrace();}}).start();}} catch (IOException e) {e.printStackTrace();}}
}
客户端(可复用 Client3.java)

解析:服务器通过无限循环接受客户端连接,每接收到一个连接就创建一个新线程来处理文件接收,这样可以同时处理多个客户端的上传请求。

TCP 通信练习 6 - 上传文件(线程池优化)

服务器(Server6.java)

java

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
​
public class Server6 {private static final int THREAD_POOL_SIZE = 5;private static ExecutorService executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
​public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(8888)) {while (true) {Socket socket = serverSocket.accept();executorService.submit(() -> {try (InputStream is = socket.getInputStream();FileOutputStream fos = new FileOutputStream("received_" + System.currentTimeMillis() + ".txt")) {byte[] buffer = new byte[1024];int len;while ((len = is.read(buffer)) != -1) {fos.write(buffer, 0, len);}System.out.println("文件接收成功");} catch (IOException e) {e.printStackTrace();}});}} catch (IOException e) {e.printStackTrace();}}
}
客户端(可复用 Client3.java)

解析:使用线程池(这里是固定大小线程池)来管理线程,避免频繁创建和销毁线程,提高系统资源利用率,当有客户端连接时,将任务提交给线程池处理。

TCP 通信练习 7 - BS(接收浏览器的消息并打印)

服务器(Server7.java)

java

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
​
public class Server7 {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(8080);Socket socket = serverSocket.accept();InputStream is = socket.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is))) {String line;while ((line = br.readLine()) != null) {System.out.println(line);if (line.isEmpty()) {break;}}} catch (IOException e) {e.printStackTrace();}}
}

解析:服务器监听 8080 端口(常用 HTTP 端口),接受浏览器连接后,通过 BufferedReader 逐行读取浏览器发送的 HTTP 请求消息并打印,当读取到空行时(HTTP 请求头结束标志)停止读取。

TCP 通信练习 8 - 控制台版的聊天室

客户端(ChatClient.java)

java

import java.io.*;
import java.net.Socket;
import java.util.Scanner;
​
public class ChatClient {public static void main(String[] args) {try (Socket socket = new Socket("localhost", 8888);OutputStream os = socket.getOutputStream();PrintWriter pw = new PrintWriter(os, true);InputStream is = socket.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));Scanner scanner = new Scanner(System.in)) {new Thread(() -> {try {String message;while ((message = br.readLine()) != null) {System.out.println(message);}} catch (IOException e) {e.printStackTrace();}}).start();
​String input;while ((input = scanner.nextLine()) != null) {pw.println(input);if ("exit".equals(input)) {break;}}} catch (IOException e) {e.printStackTrace();}}
}
服务器(ChatServer.java)

java

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
​
public class ChatServer {private static List<PrintWriter> writers = new ArrayList<>();
​public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(8888)) {while (true) {Socket socket = serverSocket.accept();new Thread(() -> {try (InputStream is = socket.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));OutputStream os = socket.getOutputStream();PrintWriter pw = new PrintWriter(os, true)) {writers.add(pw);String message;while ((message = br.readLine()) != null) {for (PrintWriter writer : writers) {writer.println(message);}if ("exit".equals(message)) {writers.remove(pw);break;}}} catch (IOException e) {e.printStackTrace();}}).start();}} catch (IOException e) {e.printStackTrace();}}
}

解析

  • 客户端:创建 Socket 连接服务器,启动一个线程用于接收服务器转发的消息并打印,通过 Scanner 读取控制台输入,将输入消息发送给服务器,输入 “exit” 时退出。

  • 服务器:监听端口接受客户端连接,为每个连接创建新线程,将每个客户端的输出流(PrintWriter)保存到列表中,读取客户端发送的消息并转发给所有客户端,当客户端发送 “exit” 时从列表中移除该客户端的输出流。

以上代码基于 Java 语言实现,在实际运行时,需根据情况调整端口等配置,并且要注意异常处理等方面的优化。

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

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

相关文章

20、.NET SDK概述

.NET SDK&#xff08;Software Development Kit&#xff09; 是微软提供的一套开发工具包&#xff0c;用于构建、运行和管理基于 .NET 平台的应用程序。它包含了一组丰富的工具、库和运行时环境&#xff0c;支持开发者在多种操作系统&#xff08;如 Windows、Linux 和 macOS&am…

DELL电脑开机进入自检界面

疑难解答 - 如何解决开机直接进入BIOS画面 添加链接描述 一、DELL电脑开机自检提示please run setup program 未设置一天中的时间-请运行安装程序(Time-of-day not set - please run SETUP program) 配置信息无效-请运行安装程序(Invalid configuration information - ple…

2025 最新版 Node.js 下载安装及环境配置详细教程【保姆级】

2025 最新版 Node.js 下载安装及环境配置详细教程【保姆级】 一、下载安装二、环境配置三、缓存配置、全局配置以及更换国内淘宝镜像源 一、下载安装 下载地址&#xff1a;Node.js 官方下载地址 双击安装&#xff0c;点击 Change 更改安装位置。我只有一个C盘&#xff0c;这里…

2025年4月通信科技领域周报(4.07-4.13):6G技术加速落地 卫星通信网络迎来组网高潮

2025年4月通信科技领域周报&#xff08;4.07-4.13&#xff09;&#xff1a;6G技术加速落地 卫星通信网络迎来组网高潮 目录 2025年4月通信科技领域周报&#xff08;4.07-4.13&#xff09;&#xff1a;6G技术加速落地 卫星通信网络迎来组网高潮一、本周热点回顾1. 华为发布全球首…

vxe-table 动态列筛选,以及筛选项动态变化的解决方案记录

需求场景&#xff1a; table 的列是由接口动态返回的&#xff1b;列的筛选项就是数据的值&#xff0c;比如【姓名】这个字段总共有三个值&#xff0c;那么姓名这一列的筛选项就是这三个值本身&#xff1b;当有一列筛选后&#xff0c;其他列的筛选项也要动态变化。 vxe-table …

UE5游戏分辨率设置和窗口模式

第一种方法: 在项目配置Config文件夹下新建 DefaultGameUserSettings.ini 输入代码 [/Script/Engine.GameUserSettings] bUseVSyncFalse ResolutionSizeX1960 ResolutionSizeY1080 LastUserConfirmedResolutionSizeX800 LastUserConfirmedResolutionSizeY600 WindowPosX-1 …

链表知识回顾

类型&#xff1a;单链表&#xff0c;双链表、循环链表 存储&#xff1a;在内存中不是连续存储 删除操作&#xff1a;即让c的指针指向e即可&#xff0c;无需释放d&#xff0c;因为java中又内存回收机制 添加节点&#xff1a; 链表的构造函数 public class ListNode {// 结点…

详解与FTP服务器相关操作

目录 什么是FTP服务器 搭建FTP服务器相关 ​编辑 Unity中与FTP相关的类 上传文件到FTP服务器 使用FTP服务器上传文件的关键点 开始上传 从FTP服务器下载文件到客户端 使用FTP下载文件的关键点 开始下载 关于FTP服务器的其他操作 将文件的上传&#xff0c;下载&…

Day92 | 灵神 | 二叉树 路径总和

Day92 | 灵神 | 二叉树 路径总和 112.路径总和 112. 路径总和 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 1.递归函数意义 如果在根节点为t的树中可以找到长度为target的路径就返回true&#xff0c;找不到就返回false 2.参数和返回值 bool tra(TreeNode …

探索鸿蒙应用开发:ArkTS应用执行入口揭秘

# 探索鸿蒙应用开发&#xff1a;ArkTS应用执行入口揭秘 在鸿蒙应用开发的领域中&#xff0c;ArkTS作为声明式开发语言&#xff0c;为开发者们带来了便捷与高效。对于刚接触鸿蒙开发的小伙伴来说&#xff0c;搞清楚ArkTS应用程序的执行入口是迈向成功开发的关键一步。今天&…

【Web API系列】Web Shared Storage API之WorkletSharedStorage深度解析与实践指南

前言 在现代Web开发领域&#xff0c;数据存储与隐私保护的矛盾始终存在。传统存储方案如LocalStorage和Cookies面临着日益严格的安全限制&#xff0c;而跨域数据共享的需求却在持续增长。正是在这样的背景下&#xff0c;Web Shared Storage API应运而生&#xff0c;其核心组件…

探索鸿蒙沉浸式:打造无界交互体验

一、鸿蒙沉浸式简介 在鸿蒙系统中&#xff0c;沉浸式是一种极具特色的设计理念&#xff0c;它致力于让用户在使用应用时能够全身心投入到内容本身&#xff0c;而尽可能减少被系统界面元素的干扰。通常来说&#xff0c;就是将应用的内容区巧妙地延伸到状态栏和导航栏所在的界面…

机器学习03——K近邻

K近邻算法学习笔记 一、算法简介 K近邻算法&#xff08;K - Nearest Neighbors&#xff0c;简称KNN&#xff09;是一种简单而有效的分类和回归算法。它的核心思想是“近朱者赤&#xff0c;近墨者黑”&#xff0c;即一个数据点的类别或值可以通过其周围最近的K个邻居来判断。K…

序列化 反序列化实例

在Python中&#xff0c; pickle 模块常用于实现对象的序列化和反序列化&#xff0c;以下是一个简单的实例&#xff1a; import pickle # 定义一个类 class Person: def __init__(self, name, age): self.name name self.age age # 创建一个Person对象 person Person("…

代码随想录算法训练营第十九天

LeetCode题目: 77. 组合216. 组合总和 III17. 电话号码的字母组合2537. 统计好子数组的数目(每日一题)516. 最长回文子序列1039. 多边形三角剖分的最低得分543. 二叉树的直径124. 二叉树中的最大路径和2246. 相邻字符不同的最长路径 其他: 今日总结 往期打卡 77. 组合 跳转: 7…

存算分离看场景

计算机行业是唯一一个比时装行业概念更多的行业。概念频出&#xff0c;最慢的话半年一定出一个&#xff0c;短的话半个月就能看到新的名词和技术甚至是概念。 存算分离的概念 我第一次听到存算分离时候还是从Hadoop上听到的。然后就去问什么是存算分离。听了讲解以后&#xf…

MCP协议,.Net 使用示例

服务器端示例 基础服务器 以下是一个基础的 MCP 服务器示例&#xff0c;它使用标准输入输出&#xff08;stdio&#xff09;作为传输方式&#xff0c;并实现了一个简单的回显工具&#xff1a; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.H…

智能语音处理+1.5使用PocketSphinxshinx实现语音转文本(100%教会)

欢迎来到智能语音处理系列的最后一篇文章&#xff0c;到这里,基本上语音处理是没问题了. 第一篇:智能语音处理1.1下载需要的库(100%实现)-CSDN博客 第二篇:智能语音识别1.2用SAPI实现文本转语音(100%教会)-CSDN博客 第三篇:智能语音处理1.3用SpeechLib实现文本转语音(100%教会)…

Kubernetes 节点摘除指南

目录 一、安全摘除节点的标准流程 1. 确认节点名称及状态 2. 标记节点为不可调度 3. 排空&#xff08;Drain&#xff09;节点 4. 删除节点 二、验证节点是否成功摘除 1. 检查节点列表 2. 检查节点详细信息 3. 验证 Pod 状态 三、彻底清理节点&#xff08;可选&#xf…

信息安全管理与评估2021年国赛正式卷答案截图以及十套国赛卷

2021年全国职业院校技能大赛高职组 “信息安全管理与评估”赛项 任务书1 赛项时间 共计X小时。 赛项信息 赛项内容 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 平台搭建与安全设备配置防护 任务1 网络平台搭建 任务2 网络安全设备配置与防护 第二…