网络编程|多线程网络编程

Linux和网络常用面试题 常用面试题 阅读详情

回顾多线程的知识

  • 进程是应用程序执行的实例,有独立的内存空间和系统资源;
  • 线程是CPU调度和分派的基本单位,进程中执行运算的最小单位,真正在CPU上运行的是线程;
  • 使用线程的步骤:
    ①定义线程
    ②创建线程对象
    ③启动线程
    ④终止线程
  • main()方法即为主线程入口
    一个进程里可以有多个线程,但至少包含一个线程(主线程),Main(String[] args)方法是主线程;
  • 如果一个类既需要使用创建线程又需要继承某个类,可以实现Runnable接口;

多线程进行网络编程的必要

1、多次数据交互

在程序中设置一个循环,通过循环,不断地向对方发送请求。

2、使服务器同时响应多个客户端的请求

服务器端每接收到一个新的连接请求,就启动一个专门的线程与该客户端进行交互。


  • 服务器:一直监听客户请求,一旦监听到有客户请求,立即创建一个新的线程,开启线程
  • 线程:接收客户请求,给予客户一个响应
  • 客户端:发送请求到服务器端,接收服务器端的响应

范例

实现一个简单的四则运算:客户端从键盘输入四则运算表达式,但不进行运算,而是将表达式传送到服务器端。服务器端接收到表达式后进行处理和计算,将运算结果返回给客户端进行显示。

优点:将简单的交互和复杂的运算进行了有效分离,能充分发挥服务器的强大处理能力。
本例由三个类组成:ClientDemo、ServerDemo、LogicThread

/**
 * 下面是客户端程序ClientDemo。
 *思路分析: 
 * ①客户端程序首先与服务器端建立连接,连接成功后生成socket对象,并进一步建立输入流和输出流对象;
 * ②使用一个循环与服务器端进行多次数据交互:从键盘输入一个四则运算表达式,将该表达式通过输出流对象传递给服务器端进行计算;
 * ③然后从输入流对象获取计算结果并进行显示,直到输入字符“0”结束数据交互后,关闭网络连接。
 */
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.Scanner;

public class ClientDemo {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String input = null;
		Socket socket = null;
		DataInputStream in = null;
		DataOutputStream out = null;
		String severIP = "127.0.0.1";// 服务器地址
		int port = 5050;// 服务器端口

		try {
			socket = new Socket(severIP, port);// 连接服务器
			in = new DataInputStream(socket.getInputStream());// 创建输入流
			out = new DataOutputStream(socket.getOutputStream());// 创建输出流
			System.out.println("请输入一个正整数的四则运算表达式");

			while (scanner.hasNext()) {
				input = scanner.nextLine();// 从键盘输入一个待计算的四则运算表达式
				if (!input.equals("0")) {
					out.writeUTF(input);// 向服务器端发送运算请求
					String result = in.readUTF();// 等待读取计算结果
					System.out.println("服务器返回的计算结果:" + result);
					System.out.println("请输入一个正整数的四则运算表达式(输入0退出):");
				} else {
					break;// 请求结束
				}
			}

		} catch (Exception e) {
			System.out.println("与服务器连接中断");
		} finally {
			try {// 关闭网络连接
				in.close();
				out.close();
				socket.close();
				System.out.println("连接结束");
			} catch (Exception e) {

			}

		}
	}
}

/**
 * 下面是服务器端程序ServerDemo。
 * 服务器端程序由两部分组成,ServerDemo类实现服务器端控制,接收客户端连接,然后启动专门的逻辑处理线程处理。
 */
import java.net.ServerSocket;
import java.net.Socket;

public class ServerDemo {
	public static void main(String[] args) {
		ServerSocket server_socket = null;
		Socket socket = null;
		int port = 5050;

		while (true) {
			try {
				server_socket = new ServerSocket(port);
				System.out.println("服务器启动!");
			} catch (Exception e1) {
				System.out.println("正在监听");// ServerSocket对象不能重复创建
			}

			try {
				System.out.println("等待客户请求");
				socket = server_socket.accept();
				System.out.println("客户的地址:" + socket.getInetAddress() + ":" + socket.getPort());
			} catch (Exception e) {
				System.out.println("正在等待客户");
			}

			if (socket != null) {
				new LogicThread(socket);// 为每个客户启动一个专门的线程
			}
		}
	}

}

/**
 * 下面是线程类程序LogicThread 。
 * 该类实现对一个客户端的逻辑处理,对接收的表达式进行计算,并将结果返回给客户端。
 */

package socketThread;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;

public class LogicThread extends Thread {
	Socket socket = null;
	DataInputStream in = null;
	DataOutputStream out = null;
	String str;
	String response;
	String ip;
	int port;

	public LogicThread(Socket socket) {
		this.socket = socket;
		start();
	}

	public void run() {
		try {
			in = new DataInputStream(socket.getInputStream());// 创建输入流
			out = new DataOutputStream(socket.getOutputStream());// 创建输出流
			ip = socket.getInetAddress().getHostAddress();// 客户端IP地址
			port = socket.getPort();// 客户端的端口号

			while (true) {
				str = in.readUTF();// 获取客户端的表达式
				System.out.println("客户端" + ip + ":" + port + "发送的请求内容:");
				System.out.println(str + "=?");

				if (str.equals("0")) {
					System.out.println("连接结束");
					break;
				} else {
					response = doComputer(str);// 对表达式进行计算
					out.writeUTF(response);// 响应计算结果
				}
			}

		} catch (Exception e) {
			System.out.println("连接结束");
		} finally {
			try {
				in.close();
				out.close();
				socket.close();
			} catch (Exception e) {

			}
		}

	}

	public String doComputer(String str) {
		String input;
		String[] sym;
		String[] data;
		int a = 0, b = 0, result = 0;
		input = str;
		data = input.split("\\D+");// 分解表达式中的正整数
		sym = input.split("\\d+");// 分解表达式中的运算符
		a = Integer.parseInt(data[0]);// 第一个正整数
		b = Integer.parseInt(data[1]);// 第二个正整数

		try {
			switch (sym[1]) {
			case "+":
				result = a + b;
				break;
			case "-":
				result = a - b;
				break;
			case "*":
				result = a * b;
				break;
			case "/":
				result = a / b;
				break;
			}
			System.out.println("计算结果:" + input + "=" + result);
			return String.valueOf(result);
		} catch (java.lang.ArithmeticException e) {
			System.out.println("数据错误!");
			return "数据错误!";
		}
	}

}

先运行ServerDemo类,然后再运行ClientDemo类。

附 :Console的使用方法

(以上面的例子为引例进行介绍)

①先运行ServerDemo类,并用Pin Console订住当前的控制台。
在这里插入图片描述
②开启另一个新的Console,然后在新的Console中运行ClientDemo类。
在这里插入图片描述

详细的Console操作方法详见:

https://blog.youkuaiyun.com/Geekst/article/details/90140606

Linux网络编程常见面试题 第三次:客户端收到服务器的SYN+ACK报文后,会检查确认号是否正确(即确认号是否为x+1),并发送一个确认报文给服务器。此外,这个报文的SYN标志位为0,因为客户端已经在第一次握手中发送过SYN,而ACK标志位为1,确认了服务器的SYN报文。这个报文包含确认号(ACK,即ack=x+1),表示收到了客户端的序列号x,并期待收到序列号为x+1的数据段。第四次挥手:客户端收到服务器的FIN报文后,会发送一个ACK报文作为响应,ACK标志置为1,确认号(ack)设置为y+1,表示收到了服务器的FIN报文。 阅读详情

相关推荐

Qt多线程网络编程实战指南

网络编程是指在计算机网络中,让不同的计算机能够相互交换数据和信息的一种编程活动。它是现代软件开发不可或缺的一部分,尤其在网络服务端和客户端的开发中扮演关键角色。网络编程允许软件跨网络实现远程过程调用、数据共享和资源管理,为现代分布式系统提供了基础。Qt是一个跨平台的C++应用程序框架,广泛用于开发具有复杂用户界面的应用程序。它支持在Windows、macOS、Linux等操作系统上的开发,使得同一套代码可以运行在不同的平台上。

weixin_35705784的博客 1130

多线程解决socket服务端长持续监听的需求-线程池的方式

更新中

努力改变人生 291

Linux环境下的C++多线程网络编程手册

多线程是指一个程序中可以同时运行多个线程,每个线程执行不同的任务。它是操作系统能够进行运算调度的最小单位,可以让程序的执行效率得到显著提升。理解线程概念是学习多线程编程的基础,线程之间可以共享进程资源,但也可能因为资源竞争引发问题,如死锁等。非阻塞I/O和异步I/O为多线程网络编程提供了更灵活、高效的处理I/O请求的能力。它们通过减少等待时间和提升并行处理能力来改善性能。然而,它们的复杂性要求开发者具备深入的理解和细致的错误处理能力,这才能在实际应用中发挥最大效益。

weixin_34456923的博客 1027

多线程解决socket服务端长持续监听的需求-实现Runnable的多线程方式

package com.glch.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Writer; import java.net.ServerSocket; import java.net.Socket; public class ServerTest

努力改变人生 1050

如何使用superpowers

"这个 bug 帮我修一下" → 我会自动走 systematic-debugging → TDD → verify 流程。- "帮我添加一个登录功能" → 我会自动走 brainstorming → plan → TDD → verify 流程。只要任务有 1% 的可能性适用某个技能,我就会先调用它再行动。→ TDD(测试驱动开发)→ verification(验证)→ code review(代码审查)提出需求 → brainstorming(头脑风暴)→ writing-plans(编写计划)

xiaojingjianqiang的博客 612

Gazebo仿真环境下的强化学习实现

实际上利用Gazebo进行强化学习无非是环境获取上的不同,Gazebo的环境控制需要使用ROS服务进行控制,状态可以通过Gazebo进行获取,同时某些必要数据需要从话题中获取,最重要的是组织获取 的数据(通过话题等)与控制Gazebo的仿真步骤之间的组合。强化学习的手段与传统算法无异,强化学习方法最重要的是要确定动作空间、状态空间、奖励空间,这三个空间是work的前提。在笔者自己的环境中,将获取里程计的话题以及获取激光点的数据替换成为了自己的本机的仿真环境匹配的话题。

Moresweet 猫甜 6450

linux网络编程面试题

I/O多路复用的本质是使用select,poll或者epoll函数,挂起进程,当一个或者多个I/O事件发生之后,将控制返回给用户进程。以服务器编程为例,传统的多进程(多线程)并发模型,在处理用户连接时都是开启一个新的线程或者进程去处理一个新的连接,而I/O多路复用则可以在一个进程(线程)当中同时监听多个网络I/O事件,也就是多个文件描述符。select、poll 和 epoll 都是 Linux API 提供的 IO 复用方式。

学而不思则罔 932

手把手教你用AFL挖掘C程序漏洞:从安装到实战(附常见错误排查)

本文详细介绍了如何使用American Fuzzy Lop (AFL)对C/C++程序进行模糊测试,从环境准备、目标程序插桩编译、初始语料库构建到实战运行与结果分析。重点讲解了AFL的安装、常见错误排查(如核心转储配置、执行速度优化)以及提升测试效率的高级策略(如持久模式、并行化),帮助开发者和安全工程师高效挖掘程序漏洞。

weixin_29014237的博客 408

多线程与网络编程

多线程允许程序在同一时间内执行多个任务,就如同一个技艺高超的杂耍艺人能够同时抛接多个球,极大地提高了程序的运行效率。想象一下,在一个文件下载程序中,如果采用单线程,那么在下载文件的过程中,程序将无法处理其他任何操作,用户只能干等着下载完成,这无疑会带来糟糕的使用体验。而引入多线程后,程序可以在下载文件的同时,响应用户的其他操作,如暂停、取消下载等,大大提升了程序的交互性和流畅性。// 自定义线程池2, // 核心线程数5, // 最大线程数60, // 线程空闲时间。

m0_74850156的博客 1162

从零构建:Esp32+Esp-IDF驱动ST7789屏幕并集成LVGL图形库

本文详细介绍了如何从零开始使用Esp32和Esp-IDF驱动ST7789屏幕并集成LVGL图形库。内容涵盖环境准备、SPI驱动配置、屏幕初始化、LVGL图形库集成及常见问题排查,帮助开发者快速实现高效稳定的显示解决方案。

weixin_42657024的博客 525

【MIT-BEVFusion代码解读】第四篇:融合特征fuser和解码特征decoder

的大小,实际上源代码也是这么做的。最后将得到两个分支的特征进行。,第一个特征使用卷积降低通道数即可,第二个则需要反卷积来提升。所以backbone只有两个分支,都是5个卷积模块组成。的长和宽都减半至90,然后在经过5个相同的。将通道降至128,后面再接5个相同的。,将通道数128上至256,并且将。特征进行融合,这里使用的。部分由两部分组成,分别是。,这个分支首先经过第一个。,然后再卷积得到 =>提取特征,最后得到特征。得到了两个大小不同的。

非晚非晚的博客 2957

python多线程和网络编程

学习目标:了解什么是进程、线程,了解什么是并行执行,掌握使用threading模块完成多线程编程,了解什么是Socket网络编程,基于Socket完成服务端程序开发,基于Socket完成客户端程序开发。

2401_87332612的博客 1334

使用 MATLAB/Simulink + Simscape Electrical + Simulink Design Optimization,构建一个沙漠环境中光伏组件灰尘积累与效率下降仿真模型

本文通过,构建了沙漠环境中光伏组件灰尘积累与效率下降仿真模型✅ 建立了风速-沙尘-积尘速率的物理关系✅ 仿真了灰尘积累过程及其对Isc 和 Pmax的影响✅ 量化分析了不同清洁策略的经济性✅ 提出了优化设计与智能运维建议。

xiaoheshang_123的博客 123

java多线程And网络编程

多线程,网络编程

2401_88007700的博客 2036

36、R语言中的回归模型与机器学习算法

本文介绍了R语言中多种回归模型和机器学习算法,包括Cox回归模型、数据平滑方法(如样条函数、多项式曲面拟合和核平滑)以及回归树模型等。重点讲解了这些方法的实现函数、参数说明以及实际应用示例,如使用`coxph`进行生存分析、使用`spline`和`smooth.spline`进行数据平滑处理、使用`loess`和`locpoly`进行非参数回归分析,以及使用`rpart`构建和可视化回归树。此外,还涉及了模型评估与优化策略,如数据拆分、交叉验证和树的修剪。通过这些方法,可以更好地处理复杂数据集并提升模型性能

yhn456789的博客 122

VS2019项目使用CGAL6.1配置教程详细步骤

在VS2019项目中使用CGAL详细步骤

插件开发 331

多线程和网络编程基础

1.实现多线程 1.1进程和线程【理解】 进程:是正在运行的程序 ​ 是系统进行资源分配和调用的独立单位 ​ 每一个进程都有它自己的内存空间和系统资源 线程:是进程中的单个顺序控制流,是一条执行路径 ​ 单线程:一个进程如果只有一条执行路径,则称为单线程程序 ​ 多线程:一个进程如果有多条执行路径,则称为多线程程序 1.2实现多线程方式一:继承Thread类【应用】 方法介绍 方法名 说明 void run() 在线程开启后,此方法将被调用执行 void start()

onefishwish的博客 720

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【网络编程】python网络编程多线程实现

python threading在网络编程中的实际应用

weixin_45589713的博客 4152

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Qt 多线程网络编程实战

摘要:本文探讨Qt多线程网络编程的核心挑战与解决方案。针对高并发场景下的单线程模型瓶颈,分析了线程安全、连接管理、数据收发和异常处理等关键问题。详细介绍Qt网络组件(QTcpSocket、QTcpServer)的使用限制,对比三种线程模型的适用场景,推荐优先采用线程池模型。通过代码示例展示线程安全通信机制,强调信号槽在跨线程数据传递中的重要性,为构建高性能、可靠的网络应用提供实践指导。(149字)

编程与实战的博客 1697

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【第七节】python多线程及网络编程

这个函数将作为新线程的入口点。

攻城狮7号的博客 991

windows多线程和网络编程

第 10 章  多线程与网络编程初步  教学提示:Windows 是一个支持多任务的操作系统。当在一个程序中需要启动另外一 个程序时,需要用到多进程的编程方式。如果一个进程中有一些相似的任务需要同时推进, 可以为每个任务建立一个线程,从而形成多线程的编程。随着网络技术的广泛应用,网络 编程也越来越受到重视,网络编程主要使用 Winsock 技术。 教学目标:掌握进程的创建与终止及相应的管

6262

java网络编程与多线程

一、Java 网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。 java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。 java.net 包中提供了两种常见的网络协议的支持: TCP:TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。...

Chain的博客 1908

多线程及网络编程

多线程 进程: 一个正在运行的程序 线程: 进程里的一条命令或者一个任务   在java中创建多线程的方法:        1,继承Thread类,重写run方法        优点: 可以直接通过start方法启动线程,        2,实现Runnable接口实现run方法 优点: 可以取消占用extends关键字, interface可以多实现, 可以实现资源

hzcv255的博客 387

多线程和网络编程

1996年Linux2.0以后,内核才开始支持线程 在os中引入进程是为了使程序能并发执行,此时进程是一个可拥有资源的独立单位(如已打开的文件,io设备),进程也是一个可独立调度和分派的基本单位。 引入线程是为了减少程序在并发执行时的时空开销。 多线程os中的进程已不再是一个可执行的实体。对进程施加的与进程状态有关的操作,实际上是通过线程实现的 每个线程都只能属于某一个进程,一个进程至少有

bingjing12345的专栏 4767

java 多线程网络编程_java理论之java多线程与网络编程

多线程一 :多线程的基本概念:1:线程是一个程序的不同的执行路径2:进程---内存区代码去的可执行代码,main方法,主线程,真正执行的方式和代码二:创建/启动新的线程:1:创建---创建新线程只有一种方法:实现Runnable中的run()是创建新线程,唯一方法(1)创建一个类,继承java.lang.Thread类:class ExThr extends Thread{}(2)创建一个普通类,...

weixin_34665627的博客 294
上一篇: 网络编程|套接字
下一篇: Eclipse控制台多开方法
Geekst
博客等级 码龄8年 15粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值