当前位置: 首页 > news >正文

4.网络编程

1、目的

  • 传播交流信息
  • TCP:打电话
  • UDP:发短信

2、通信协议:

  • http
  • TCP/IP簇:三次握手(aba),四次挥手(abba)
  • https

3、IP与端口

1.IP地址类:InetAddress、InetSocketAddress
InetAddress inetAddress1 = InetAddress.getLocalHost();
InetAddress inetAddress2 = InetAddress.getByName("");
inetAddress1.getHostName();		//计算机名
inetAddress2.getHostAddress();	//IP地址
2.端口
  • 单个协议下,端口号不能冲突

  • 公有端口0-1023

    • HTTP:80
    • HTTPS:443
    • FTP:21
    • Telent:23
  • 程序注册端口:1024-49151

    • MySQL:3306
    • ORACLE:1521
  • 端口查看的dos命令:

    netstat -ano					#查看所有端口
    netstat -ano |findstr 1521		#查看1521这个端口
    

4、UDP编程实例

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
//使用UDP通信实现接收多条消息,并可以同时接收多个客户端的消息
public class ReceiveDemo02 {public static void main(String[] args) throws IOException {System.out.println("----服务端启动----");//创建接收端的Socket对象,并配置监听端口,端口10000与发送端dp里配置的端口相同DatagramSocket socket = new DatagramSocket(10000);//创建数据包对象,配置接收数组、数组大小DatagramPacket dp = new DatagramPacket(new byte[1024], 1024);while (true) {//receive会进行线程阻塞socket.receive(dp);//打印接收的数据,对dp.getData()进行一个实际数据大小的截位System.out.println("收到来自" + dp.getAddress().getHostAddress() + "的消息:" + new String(dp.getData(), 0, dp.getLength()));}//释放资源//socket.close();}
}
import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
//使用UDP通信实现发多条消息
public class SendDemo02 {public static void main(String[] args) throws IOException {System.out.println("----客户端启动----");Scanner scanner = new Scanner(System.in);//创建发送端的Socket对象,系统会随机分配一个端口号DatagramSocket socket = new DatagramSocket();while (true){System.out.println("请输入要发送的内容:");String next = scanner.next();if(next.equals("exit")){//释放资源socket.close();return;}else {//定义存放数据的数组byte[] bytes = next.getBytes(StandardCharsets.UTF_8);//创建数据包对象,配置发送数据、数据长度、对方IP、对方端口DatagramPacket dp = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"), 10000);//发送数据socket.send(dp);}}}
}

5、TCP编程实例

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
//客户端多发消息
public class ClientDemo04 {public static void main(String[] args) throws IOException {Scanner scanner = new Scanner(System.in);//创建Socket,配置服务端IP与端口Socket socket = new Socket("127.0.0.1", 10012);//调用socket.getOutputStream()获取输出流,并用DataOutputStream进行包装DataOutputStream dos = new DataOutputStream(socket.getOutputStream());while (true){System.out.println("请输入要发送的数据:");String next = scanner.next();if(next.equals("exit")){//关闭流dos.close();socket.close();return;}else {//发送数据dos.writeUTF(next);}}}
}
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
//目标:掌握利用线程池优化tcp服务端的方式
public class ServerDemo04 {public static void main(String[] args) throws IOException {//创建ServerSocket对象,配置监听端口ServerSocket serverSocket = new ServerSocket(10012);//创建线程池final ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(3, 5, 60, TimeUnit.SECONDS,new LinkedBlockingQueue<>(10), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());System.out.println("服务端启动成功");while (true) {//调用serverSocket.accept();,阻塞线程,等待客户端连接Socket socket = serverSocket.accept();System.out.println(socket.getInetAddress().getHostAddress() + ":" + socket.getPort() + "连接成功");//新建线程处理消息接收Thread thread = new Thread(() -> {//获取socket的流数据,并用DataInputStream进行封装try (DataInputStream dis = new DataInputStream(socket.getInputStream())) {while (true) {//打印信息,dis.readUTF()阻塞线程,等待客户端发送消息System.out.println("收到来自" + socket.getInetAddress().getHostAddress() + ":" + socket.getPort() + "的数据: " + dis.readUTF());}} catch (Exception e) {//当客户端意外断开时,会出现异常,在此进行手动处理System.out.println(socket.getInetAddress().getHostAddress() + ":" + socket.getPort() + " 断开连接");}}, socket.getInetAddress().getHostName());//将线程添加到线程池,线程池会自己启动线程,不需要单独调用start()poolExecutor.execute(thread);/*//关闭流dis.close();socket.close();serverSocket.close();*/}}
}
http://www.lryc.cn/news/437930.html

相关文章:

  • OpenCV GUI常用函数详解
  • Tuxera NTFS for Mac破解版下载 Tuxera NTFS for Mac2023激活码 mac电脑ntfs磁盘软件
  • oceanbase(ob)基于备份集搭建备租户方式
  • Javase复习day21算法、arrays、Lamdba表达式
  • 移动硬盘无法读取?别慌!这些方法助你恢复数据!
  • Java集合面试(上)
  • Python画笔案例-046 绘制小红伞
  • 使用 .NET 6 构建跨平台 Worker Service 服务:跨越平台的 C# 服务开发——解决Windows服务跨平台问题
  • terminator-gnome
  • 7.测试用例设计方法 + Bug
  • uniapp小程序,使用腾讯地图获取定位
  • Reactive 编程-Project Reactor
  • splice用法
  • Redis - 缓存
  • 基于SpringBoot+Vue的养老院管理系统
  • 多线程爬虫接入代理IP:高效数据抓取的秘诀
  • [网络][CISCO]Cisco-PIX配置详解
  • 拒绝千篇一律,AI帮你定制独一无二的个人写真
  • 在云服务器上安装 RabbitMQ:从零到一的最佳实践
  • 【nginx】搭配okhttp 配置反向代理
  • Android V 广播注册和配置注意事项问题
  • 深入解读Docker核心原理:Namespace资源隔离机制详解
  • 学习通、智慧职教刷课脚本
  • SEO写作:从实战到精进的全方位指南
  • 解决 git 不是内部或外部命令,也不是可运行的程序
  • 【卷起来】VUE3.0教程-07-异步请求处理(springboot后端)
  • 初一信息科技2024指南辅助教学软件(抓包软件)
  • 上汽大众:存储成本节约85%,查询性能提升5倍|OceanBase案例
  • 如何快准稳 实现MySQL大表历史数据迁移?
  • C和指针:函数