Java网络编程实现

2023-05-16

前言

计算机网路实现了多个网络终端的互联,彼此之间能够进行数据交流。而网络应用程序就是在已连接的不同终端设备上运行的程序,这些网络程序相互之间可以进行数据交互。网络程序的数据交互则依赖于TCP/IP协议,在实际应用中TCP网络程序提供可靠的数据通信,而UDP网络程序则不保证数据的可靠性,但是协议简单、传输速度快(比如用在音视频数据传输,它们不需要很高的可靠性,偶尔丢帧是可以忍受的)。

ServerSocket类

Java.net包中的ServerSocket类用于表示服务器套接字,其主要功能是监听客户端的请求,然后将客户端的请求连接存入队列中,默认请求队列大小是50。构造方法主要有以下几种形式:

ServerSocket():创建非绑定服务器套接字。

ServerSocket(int port):创建绑定到特定端口的服务器套接字。

ServerSocket(int port,int backlog):利用指定的backlog创建服务器套接字并将其绑定到指定的本地端口号。

ServerSocket(int port,int backlog,InetAdress bindAddress):使用指定的端口、监听backlog和要绑定到本地IP地址创建服务器,适用于计算机有多个网卡、多个IP的情景。

TCP网络程序实例

服务端程序代码

//服务端程序
import java.io.*;
import java.net.*;
public class MyTcpServer {
	private BufferedReader reader;
	private PrintWriter writer;
	private ServerSocket server;
	private Socket socket;
	void getserver(){
		try{
			server = new ServerSocket(8866);
			System.out.println("服务器套接字已经创建成功");
			while(true){
				System.out.println("等待客户机的连接");
				socket = server.accept();	//阻塞的
				reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				writer = new PrintWriter(socket.getOutputStream(),true);
				getClientMessage();			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	private void getClientMessage(){
		try{
			while(true){
				System.out.println("客户端信息接收:"+ reader.readLine());
				writer.println("欢迎您连接服务端");
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		try{
			if(reader != null){
				reader.close();
			}
			if(writer != null){
				writer.close();
			}
			if(socket != null){
				socket.close();
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}
public class Main {
	public static void main(String[] args) {
		MyTcpServer tcpserv = new MyTcpServer();
		tcpserv.getserver();
	}

}

客户端程序代码

//客户端程序
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;


public class MyTcpClient {
	private PrintWriter writer;
	private BufferedReader reader;
	Socket socket;
	public void connect(){
		System.out.println("尝试连接");
		try{
			socket = new Socket("127.0.0.1",8866);
			writer = new PrintWriter(socket.getOutputStream(),true);
			reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			System.out.println("连接成功");
			writer.println("你好,来自客户端的连接");
			getserverMessage();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	private void getserverMessage(){
		try{
			while(true){
				System.out.println(":"+ reader.readLine());				
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		try{
			if(reader != null){
				reader.close();
			}
			if(writer != null){
				writer.close();
			}
			if(socket != null){
				socket.close();
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
	
}

public class Main {
	public static void main(String[] args) {
		MyTcpClient tcpclient;
		tcpclient = new MyTcpClient();
		tcpclient.connect();
	}

}

服务端运行效果图

客户端运行效果图

UDP网络程序

使用UDP协议的程序流程简单很多,它收发包流程如下:

UDP网络通信的发包过程:

  1. 使用DatagramSocket()创建一个数据包套接字。
  2. 使用DatagramPacket(byte[]buf,int offset,int length,InetAddress address,int port)创建要发送的数据包。
  3. 使用DatagramSocket类的send()方法数据包。

UDP网络通信的收包过程:

  1. 使用DatagramSocket()创建一个数据包套接字,绑定到指定的端口。
  2. 使用DatagramPacket(byte[]buf,int length)创建字节数组来接收数据包.
  3. 使用DatagramPacket类的receive()方法接收UDP。

总结

网络编程是程序实现网络通信的基石,在互联网高度繁荣的当下,几乎没有什么应用不需要网络支持。网络通信基于TCP/IP,基于此,网络编程可以选择使用TCP传输或UDP传输,它们两个是比较底层的通信协议,TCP提供可靠的连接,UDP则不提供可靠的连接,在实际应用中大多数选用TCP,而UDP主要用于音视频、NTP对时这种对数据可靠性要求不是那么高的场合。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java网络编程实现 的相关文章

  • 嵌入式linux项目之智能仓储(基于正点原子IMX6ULL开发板)

    基于正点原子的IMX6ULL开发板的智能仓储项目 提示 xff1a 该项目根据华清远见智能仓储项目改版 xff0c 将他的A9开发板换成了自己的IMX6ULL开发板 同时等我将该项目整个流程完成之后 xff0c 会为大家附上适配正点原子li
  • STM32电路知识学习

    STM32最小系统板电路知识学习 单片机最小系统是指用最少的电路组成单片机可以工作的系统 xff0c 通常最小系统包含 xff1a 电源电路 时钟电路 复位电路 调试 下载电路 xff0c 对于STM32还需要启动选择电路 总之 xff0c
  • ubuntu18.04运行vins-fusion跑通自己的数据集

    博主是双目加imu 命令 xff1a xff08 一定要记得改成自己的路径哦 xff09 cd catkin ws source devel setup bash roslaunch vins vins rviz launch source
  • 17.C语言 常见面试题

    嵌入式工程师必备0x10到题目 宏定义 1 用预处理指令 define声明一个常数 xff0c 用于表明1年中有多少秒 define 宏名 宏体 宏名 xff1a 大写字母表示 define SECOND OF YEAR 365 24 36
  • 自动控制原理第一章

    开环控制系统 xff1a 输入量与输出量没有反向联系 被控量 xff08 输出信号 xff09 xff0c 系统在特定输入下的输出称系统对该输入的响应 控制量 xff08 输入信号 xff09 给定值 扰动 xff1a 破坏控制量与被控量正
  • 利用Mavros控制无人机

    准备 xff1a 1 ubuntu18 04 2 Qgc 3 Mavros 4 ROS 5 PX4 Mavros安装 xff1a 参考安装链接 xff1a Ubuntu18 04安装px4 43 mavros xff08 解决mavros报
  • 5分钟搭建MySQL监控平台(mysql-exporter+Prometheus+Grafana)

    一 工具介绍 Prometheus 普罗米修斯可以简单理解为一个监控工具 xff0c 以时间为单位展示指定数据维度的变化 趋势 span style color fe2c24 strong mysqld exporter strong sp
  • Prometheus环境搭建

    实验环境 xff1a 准备三台虚拟机 xff0c 本文用Centos7为例 xff1b 我这里所使用的的虚拟机地址分别为 xff1a 主机名 xff1a IP prometheus weme 192 168 10 63 agent weme
  • 无人机飞控系统硬件设计

    目录 一 飞行控制系统简介 1 飞控系统功能分析 2 飞控系统基本原理 3 飞控系统的组成部分 3 1 地面部分 3 2 中央处理器 3 3 传感器模块 3 4 传输定位模块 二 飞控系统硬件平台设计 一 飞行控制系统简介 1 飞控系统功能
  • Ubuntu20.04中怎么更换源都不行install或者update始终报错,解决方案

    更换源后安装或者更新依旧报错 xff0c 试试下面两种方法 xff0c 亲测可行 方法一 xff1a 静态ip改成动态ip 如果ip是静态改成动态ip后 xff0c 重新在试试apt update 1 vi etc netplan 00 i
  • AlphaGo 引发的中国象棋之路

    笔者是一位多年的象棋爱好者 xff0c 早在2005 xff0c 中国象棋有款软件奇兵1 04 xff0c 当时打败特级大师于幼华 xff0c 又打败了柳大华 xff0c 后期软件和计算机硬件的发展 xff0c 象棋软件又有了质的飞越 xf
  • linux驱动IO模型

    1 非阻塞 当应用层读取驱动中的数据时 xff0c 无论数据是否准备号 xff0c 都需要立即返回 open 34 dev mycdev 34 O RDWR O NOBLOCK 非阻塞方式打开 默认打开方式为阻塞方式打开 O NOBLIOC
  • ROS学习(一)工作空间,功能包,节点

    本文主要介绍建立一个功能包 xff0c 一个publisher结点 xff0c 实现话题的发布 一工作空间 1创建所需的文件夹 mkdir ros cd ros mkdir src 2工作空间的初始化 cd src catkin init
  • NVIDIA Jetson Xavier NX搭建pytorch gpu环境(超详细)

    NVIDIA Jetson Xavier NX开发套件在搭建tensorflow gpu环境时可以使用指令直接安装或者官网下载whl文件安装 作者在安装pytorch环境时总是安装不上gpu版本 报错 AssertionError Torc
  • uCOS-iii学习笔记(11)——任务信号量和任务消息队列

    理解 xff1a 任务信号量 任务消息队列是跟随任务创建而来的 xff0c 不需要额外创建 xff0c 并且他和多值信号量 消息队列有一些不同 xff0c 多值信号量他们是建立于1对多得关系 xff0c 而我们的任务信号量还有任务消息队列是
  • C语言当中什么情况下形参可以改变实参详细实例及解释

    在 C 语言中 xff0c 形参可以改变实参的值的情况与 C 43 43 类似 xff0c 也有传递指针和传递引用两种方式 传递指针 当我们传递一个指针作为函数的形参时 xff0c 函数内部同样可以通过这个指针来改变指向的实参的值 这是因为
  • git仓库与vscode关联

    git仓库与vscode关联 git安装完后 xff0c 会提示输入用户信息 a 设置用户名 xff1a git config global user name 39 你再github上注册的用户名 39 b 设置用户邮箱 xff1a gi
  • python修改全局变量

    span class token comment 全局变量 span num span class token operator 61 span span class token number 10 span span class toke
  • python函数不能修改全局变量

    span class token comment 全局变量 span num span class token operator 61 span span class token number 10 span span class toke
  • FreeRTOS笔记(六)互斥量mutex

    概念 互斥量是二进制信号量的一个变种 xff0c 开启互斥量需要在头文件FreeRTOSConfig h 设置configUSE MUTEXES 为1 互斥量和信号量的主要区别如下 互斥量用于保护资源时必须要被返还 信号量用于数据同步时不需

随机推荐

  • 完爆面试官!spring可能带来的一个深坑

    4步套路 xff0c 解决动态规划问题 1 确定问题状态 提炼最后一步的问题转化 2 转移方程 xff0c 把问题方程化 3 按照实际逻辑设置初始条件和边界情况 4 确定计算顺序并求解 结合实例感受下 xff1a 你有三种硬币 xff0c
  • 树莓派Raspberry Pi 2B在Kali上使用TightVNCServer灰屏

    1 将 root vnc xstartup改为 span class token shebang important bin sh span unset SESSION MANAGER unset DBUS SESSION BUS ADDR
  • STM32——UCOSIII 简介

    目录 UCOSIII简介 UCOSIII中的任务 组成 任务堆栈 任务控制块 任务函数 任务函数模板 UCOSIII系统任务 组成 空闲任务 时钟节拍任务 统计任务 定时任务 中断服务管理任务 UCOSIII任务状态 组成及状态概念 UCO
  • ARM —— 寄存器的封装

    目录 SFR 直接一对一封装 结构体封装寄存器 SFR 全称 xff1a 特殊功能寄存器 xff08 Special Function Register xff09 作用 xff1a 用于 控制片内外设 xff0c 存放 相应功能部件的 控
  • Ubuntu给Pix2.4.8刷Ardupilot固件

    全文基于waf编译器使用 waf命令 xff0c APM官网对于waf的使用描述 xff1a https github com ArduPilot ardupilot blob master BUILD md 前提 xff1a 已经在ubu
  • 程序猿面试经验总结(经验篇)

    开篇序 金九银十大家都知道吧 xff0c 的确九十月份都是跳槽旺季与招聘旺季 xff0c 无论是找工作的 招聘的单位都是特别特别的多 xff0c 多的你有时候看都看不过来 xff0c 以至于让你有时候很难选择 xff0c 其实选择对应自己的
  • STM32 HAL库和标准库的原理区别

    STM32 HAL库和标准库的原理区别 HAL简介 HAL库 xff0c HAL是Hardware Abstraction Layer的缩写 xff0c 中文名称是 xff1a 硬件抽象层 xff0c 是st公司为了更方便地进行stm32之
  • 【超详细~】js的三大定时器:setTimeout、setInterval、requestAnimationFrame

    setTimeout xff08 表达式 xff0c 时间 xff09 61 gt 是指延迟指定时间后才调用函数 xff0c 调用次数仅一次 xff1b setInterval xff08 表达式 xff0c 时间 xff09 61 gt
  • FreeRTOS的学习(一)——实时操作系统和多任务的介绍

    目录 1 初识FreeRTOS 2 FreeRTOS 任务的状态 3 FreeRTOS 的任务 任务的创建和删除 1 xTaskCreate xff1a 使用静态的方法创建一个任务 2 xTaskCreateStatic xff1a 使用静
  • FreeRTOS的学习(四)—— 信号量之间的优先级翻转问题和互斥信号量

    目录 优先级翻转现象 什么是优先级翻转 互斥信号量 1 互斥信号量简介 2 创建互斥信号量 1 函数 xSemaphoreCreateMutex 2 函数 xSemaphoreCreateMutexStatic 3 释放互斥信号量 4 获取
  • STC15单片机 固定翼无人机/航模 飞控程序

    stc15单片机 固定翼无人机 飞控程序 硬件 stcf2k60s22 4g无线通信模块nrf24l01mg90s数字舵机摇杆无刷电机电调 用到的单片机资源 pwmad转换 程序结构 利用ADC转换读取摇杆值将摇杆数值转换为16进制通过2
  • ESP8266 WIFI 模块使用说明

    ESP8266是ai thinker公司推出的一款无线WIFI模块 xff0c 可以通过配置 xff0c 和单片机上的串口进行通信 xff0c 利用WIFI传输数据 1 AT指令简介 同许多通信模块一样 xff0c 我们需要对WIFI模块利
  • Ubuntu18更新软件源、安装python3.8和安装pip

    目录 一 更新软件源二 安装python3 8三 安装pip 一 更新软件源 1 xff09 首先 xff0c 打开sources list文件 sudo vim etc apt sources list 若没有vim xff0c 则需要进
  • Python 迭代器 与 异常处理

    文章目录 迭代介绍可迭代对象迭代器对象迭代器对象取值 方法的简写for循环内部原理异常处理异常的分类异常的类型异常的处理try except 语句try except else 语句try except finally 语句try exce
  • linux系统进程 exec函数族的使用(fork之后)

    1 2 exec 函数族 头文件 unistd h 3 exec 函数可用在fork 函数之后 xff0c 直接执行一个程序而省略子进程复制父进程的资源 4 调用exec不会创建一个新的pid 5 6 path xff1a 可执行文件的路径
  • Collecting package metadata (current_repodata.json): failed的问题解决

    解决方法 1 删除 condarc文件 2 关闭VPN 3 https的锅 xff0c 详情看下面的博客 环境配置 Collecting package metadata current repodata json failed的问题解决
  • 作业1:CAN数据库配置(DBC)

    目录 一 首先如何创建dbc文件 二 创建 三 创建节点NODE 一 其它 xff08 共1题 xff0c 100分 xff09 1 其它 使用vector candb editor软件 xff0c 按给定的信号矩阵配置CAN xff0c
  • Visual Studio 2022 C++下载及配置

    下载地址 xff1a https visualstudio microsoft com zh hans vs 之后点击右下角的安装 xff1b 如果下载速度一直为0 xff0c 那么解决方法为 xff1a 修改电脑的DNS服务器地址为8 8
  • app测试和web测试的区别

    1 功能方面 xff1a 在流程和功能测试上是没有区别的 xff0c 系统测试和一些细节可能会不一样 那么我们就要先来了解 xff0c web和app的区别 xff1a web项目 xff0c 一般都是b s架构 xff0c 基于浏览器的
  • Java网络编程实现

    前言 计算机网路实现了多个网络终端的互联 xff0c 彼此之间能够进行数据交流 而网络应用程序就是在已连接的不同终端设备上运行的程序 xff0c 这些网络程序相互之间可以进行数据交互 网络程序的数据交互则依赖于TCP IP协议 xff0c