JAVA#(四)网络编程基础

深入解析Java网络连接问题:从Connection refused到telnet服务配置 本文深入解析Java开发中常见的Connection refused错误,系统梳理了服务未运行、端口绑定错误、防火墙拦截及连接数超限四大原因,并重点介绍了使用telnet工具进行网络连接诊断的实战方法,帮助开发者快速定位和解决网络连接问题。 阅读详情

网络编程基础

参考文章:https://www.cnblogs.com/swordfall/p/10781281.html
整理总结:
IOS模型
TCP/IP模型
模型及其对应层次的协议即作用
IP协议
TCP协议
UDP协议
HTTP协议
HTTPS协议

Socket

Socket,实际上是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
Socket的出现,只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、listen、accept、send、read和write等等。

解决问题:主要解决如何包装数据
socket的全部流程

HTTP协议实现代码实例

普通流传输
Client:

  • 构建TCP协议实现类对象socket,方便按照TCP协议建立连接
  • 实现socket,让socket有实际意义,只需要将IP和端口就能确定本线程的目标
  • 从socket那里构建一个输出流,方便数据写入输出流
  • 将数据写入输出流后,关闭输出流,再关闭socket
    Server:
  • 通过给ServerSocket对象赋值,开启端口,以便接收数据
  • ServerSocket对象可以接收从端口得到传来的Socket对象A
  • 然后可以从A中获得到输入流,再从输入流中获取数据(定义输出流来输出输入流中的数据)
  • 关闭输出流,再关闭输入流,最后关闭socket和serverSocket
public class Client {
    public static void main(String[] args) {
        client();
    }
    public static void client(){
        OutputStream output = null;
        Socket socket = null;
        try {
            InetAddress localHost = InetAddress.getByName("127.0.0.1");
            socket = new Socket(localHost,8848);
            output = socket.getOutputStream();
            output.write("hello I'm the client".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(output != null){
                try {
                    output.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

public class Server {
    public static void main(String[] args) {
        server();
    }
    public static void server() {
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream input = null;
        ByteArrayOutputStream out = null;
        try {
            serverSocket = new ServerSocket(8848);
            socket = serverSocket.accept();
            System.out.println("client IP: " + socket.getInetAddress());
            input = socket.getInputStream();
            /*
            一般不建议这样书写,数据传输时可能会出现乱码!!
            byte[] buffer = new byte[1024];
            int len;
            while((len = input.read(buffer)) != -1){
                String data = new String(buffer,0,len);
                System.out.println(data);
            }*/

            out = new ByteArrayOutputStream();
            byte[] buffer = new byte[10];
            int len;
            while((len = input.read(buffer)) != -1){
                out.write(buffer,0,len);
            }
            System.out.println(out.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(out != null){
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(input != null){
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(serverSocket != null){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

文件流传输
Client:将文件传递给服务器

  • 创建文件,得到文件用来创建文件流
  • 定义socket,设定socket的ip,port,输出流
  • 通过输入流将文件流放入socket的输出流中
  • 传递完毕后,关闭输入流,在关闭输出流,最后关闭socket
    Server:收到文件将其保存在本地文件中
  • 创建ServerSocket,指定端口后可以通过SereverSocket获得这个端口传来的Socket
  • 获得到Socket后,去得到里面的输入流
  • 建立文件输出流来获得Socket的输入流
  • 关闭文件输出流,再关闭socket中的输入流,然后关闭socket对象,最后关闭serverScoket
public class TcpClientDemo02 {
	public static void main(String[] args) throws Exception {
		
			Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9000);
			OutputStream os = socket.getOutputStream();
			File file = new File("src/web_study_lession2/asd.jpg");
			BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
			
			byte[] buffer = new byte[1024];
			int len;
			while((len = bis.read(buffer))!= -1) {
				os.write(buffer,0,len);
			}
			
			bis.close();
			os.close();
			socket.close();
	}
}
public class TcpSeverDemo02 {
	public static void main(String[] args) throws Exception {
		ServerSocket serverSocket = new ServerSocket(9000);
		System.out.println("已经打开端口9000,等待客服端连接");
		Socket accept = serverSocket.accept();//阻塞式监听,会一直监听,直到监听到
		System.out.println("连接客服端的IP:"+accept.getInetAddress());

		InputStream is = accept.getInputStream();
		File receive = new File("receive.txt");
		if(!receive.exists()){
			receive.createNewFile();
		}
		FileOutputStream fos = new FileOutputStream(receive);
		
		byte[] buffer = new byte[1024];
		int len;
		while((len = is.read(buffer))!= -1) {
			fos.write(buffer, 0, len);
		}
		fos.close();
		is.close();
		accept.close();
		serverSocket.close();
	}
}

UDP协议实现代码实例

客服端将数据报发送到服务端
服务端:
1.打开端口
2.接收数据包
3.处理数据包
4.关闭连接

public class UdpServerDemo {
    public static void main(String[] args) throws Exception {
        //开放端口
        DatagramSocket socket = new DatagramSocket(9090);
        // 接收数据
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
        socket.receive(packet);
        //关闭连接
        socket.close();

        //输出包中内容
        System.out.println(packet.getAddress().getHostAddress());
        System.out.println(new String(packet.getData(),0, packet.getLength()));
    }
}

服务端:
1.确定目标(ip和端口)
2.建立包
3.发送包

public class UdpClientDemo {
    public static void main(String[] args) throws Exception {
        //建立socket通信
        DatagramSocket socket = new DatagramSocket();
        //建立包
        String msg = "nihao";
        InetAddress localhost = InetAddress.getByName("localhost");
        int port = 9090;
        DatagramPacket packet = new DatagramPacket(msg.getBytes(),0, msg.getBytes().length, localhost, port);
        //发送包
        socket.send(packet);
    }
}

通过url下载数据

1.创建url
2.通过url获得连接
3.在连接上获得输入流
4.创建自己的输出流用来输出文件
5.将输入流转化为输出流
6.关闭输出流,输入流,连接

public class UrlDown {
    public static void main(String[] args) throws Exception {
        URL url = new URL("https://m801.music.126.net/20210503215010/1395364ef0339e371ea7b50e104ba131/jdyyaac/025e/540b/5408/54ea83527dca9d54d4cbcbdbb445a2d5.m4a");

        URLConnection urlConnection = (HttpURLConnection)url.openConnection();

        InputStream inputStream = urlConnection.getInputStream();

        FileOutputStream fos = new FileOutputStream("a.m4a");
        byte[] buffer = new byte[1024];
        int len;
        while((len = inputStream.read(buffer))!= -1){
            fos.write(buffer,0, len);
        }
        fos.close();
        inputStream.close();
        ((HttpURLConnection) urlConnection).disconnect();

    }
}

即时传输(创建对话)

一.发送端对应的类
1.创建发送端的socket
2.创建输入流(调用输入),再将其包装成Reader
3.将其线程化(实现Runnable)
4.运行此类时:
将流转换为字符串,再将字符串转化为字节
将字节打包成数据报
通过socket把数据报传出
添加结束判断,如果输入流转化为字符串后有"bye"那么跳出循环(结束线程)

public class TalkSend implements Runnable{
    DatagramSocket socket = null;
    BufferedReader reader= null;

    private int fromPort;
    private String toIP;
    private int toPort;

    public TalkSend(int fromPort,String toIP,int toPort){
        this.fromPort = fromPort;
        this.toIP = toIP;
        this.toPort = toPort;

        try{
            socket = new DatagramSocket(fromPort);
            reader = new BufferedReader(new InputStreamReader(System.in));
        }catch (Exception e){
            e.printStackTrace();
        }

    }
    @Override
    public void run(){
        while(true){
            try{
                String data = reader.readLine();
                byte[] dataBytes = data.getBytes();
                DatagramPacket packet = new DatagramPacket(dataBytes,0,dataBytes.length,
                        new InetSocketAddress(this.toIP,this.toPort));

                socket.send(packet);
                if(data.equals("bye")){
                    break;
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        socket.close();
    }
}

二.接收端对应的类
1.创建接收端的socket
2.将其线程化(实现Runnable)
3.运行此类时:
创建数据报来接收传过来的数据报
将数据报转化为字节数组,再转化为字符串
做结束进程判断(若接收到的字符串有bye,那么结束进程)

public class TalkReceive implements Runnable{

    DatagramSocket socket = null;
    private int port;
    private String msgfrom;
    public TalkReceive(int port,String msgfrom){
        this.port = port;
        this.msgfrom = msgfrom;
        try{
            //DatagramSocket socket = new DatagramSocket(port);
            this.socket = new DatagramSocket(port);
        }catch (Exception e){
            e.printStackTrace();
        }

    }

    @Override
    public void run() {
        while(true){
            try {
                byte[] buffer = new byte[1024];
                DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
                socket.receive(packet);

                byte[] data = packet.getData();
                String receiveData = new String(data, 0, packet.getLength());
                //注意接收数据包中内容时开始为0,终止用packet.getLength(),不能用data.lenth,否则乱码
                System.out.println(msgfrom+":"+receiveData);
                System.out.println("qwerasd");
                //如果传来的数据是bye则断开接收
                if(receiveData.trim().equals("bye")){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

三.应用接收和发送类实现互交
1.创建两个实现对象类
2.两个都调用接收线程和发送线程

public class TalkTeather {
    public static void main(String[] args) {
        new Thread(new TalkSend(5555,"localhost",8999)).start();
        new Thread(new TalkReceive(9999,"student")).start();
    }
}
public class TalkStudent {
    public static void main(String[] args) {
        new Thread(new TalkSend(7777,"localhost",9999)).start();
        new Thread(new TalkReceive(8999,"teacher")).start();
    }
}
JDK安装及JRE说明 组件全称功能定位JDK面向开发者的完整工具包,包含编译、调试、运行Java程序所需的所有工具JRE面向终端用户的运行时环境,仅提供运行已编译Java程序所需的核心组件。 阅读详情

相关推荐

CCS环境下ADC采样波形的实时可视化调试技巧

本文详细介绍了在CCS环境下实现ADC采样波形实时可视化的调试技巧。通过数组缓存优化、多通道同步显示和波形测量工具的高级用法,帮助开发者高效调试嵌入式系统中的ADC采样问题,提升信号分析的准确性和效率。

weixin_33712987的博客 419

Java#36(网络编程)

网络编程的基础知识

guaiwu_的博客 801

告别FreeRTOS?手把手带你用NuttX在STM32F4-Discovery上跑起第一个Shell

本文详细介绍了如何在STM32F4-Discovery开发板上从FreeRTOS迁移到NuttX,并运行第一个Shell。NuttX以其完整的POSIX兼容性和模块化架构优势,特别适合复杂网络应用的开发。通过环境搭建、移植配置、调试技巧及POSIX开发实践,帮助开发者高效构建嵌入式系统。

weixin_42526417的博客 300

java#0 基本概念

1995年由sun推出。推出时主要针对的是消费电子产品,手机,MP3等。但是因为互联网的兴起,java成为大型互联网项目的首选语言。2009年,oracle收购sun,取得java版权。Java 目前的主要应用方向是Web开发和Android开发,大部分IT公司招聘的Java程序员也是从事这两方面的工作。JVM也是一个软件,不同的平台有不同的版本。我们编写的Java源码,编译后会生成一种 .clas

764

保姆级教程:用GD32F470的EXMC Bank0 Region0与FPGA实现16位并行通信(附完整代码)

本文详细介绍了如何利用GD32F470的EXMC Bank0 Region0与FPGA实现16位并行通信,涵盖硬件连接、寄存器配置、时序优化及FPGA接口设计等关键步骤。通过实例代码和调试技巧,帮助开发者快速掌握高效数据交互技术,提升嵌入式系统设计能力。

weixin_26918763的博客 226

CSR-DCF视频目标跟踪源码运行笔记

论文基本信息 论文标题:Discriminative Correlation Filter with Channel and Spatial Reliability 论文作者:Alan Lukezic等 论文出处:CVPR 2017 文章链接:https://arxiv.org/abs/1611.08461 补充材料:https://www.semanticscholar.org/paper/D...

越野者的博客 3400

java#6 网络编程之InetAddress,URLDecoder和URLEncoder,URL和URLConnection

一、InetAddress        1、java提供InetAddress类代表IP地址,InetAddress下含有两个子类:        Inet4Address、Inet6Address,他们分别代表IPv4地址和IPv6地址。        2、InetAddress类没有构造器,提供如下两个静态方法来获取InetAddress实例:        getByName(St

lanmodadi的专栏 770

Synares病毒实战:如何从U盘感染中恢复你的Excel和EXE文件(附专杀工具推荐)

本文详细介绍了Synares感染型病毒的典型特征与传播机制,特别是其通过U盘感染Excel和EXE文件的行为。文章提供了一套从应急隔离、诊断到使用专杀工具进行深度清除与文件恢复的完整实战流程,并推荐了有效的安全软件和修复方法,旨在帮助用户最大程度救回重要数据并构建长效安全防护习惯。

weixin_29230649的博客 1828

Java 基础教程

Java 是一种广泛使用的计算机编程语言,拥有「一次编写,到处运行」(Write Once, Run Anywhere,WORA)的跨平台特性。Java 由 Sun Microsystems 公司于 1995 年推出,2009 年被 Oracle 公司收购。JDK(Java Development Kit)是 Java 开发工具包,包含了 Java 运行环境(JRE)和开发工具。 macOS 系统安装步骤 验证安装 安装完成后,打开命令行工具,执行以下命令验证安装是否成功: 如果安装成功,将显示 Java

码上红尘仙的博客 1027

液滴/液膜蒸发过程—in文件模拟-后处理分析-Ovito/Python绘图

液滴/液膜蒸发过程—in文件模拟-后处理分析-Ovito/Python绘图

Rockyoung 3325

YOLOv13必学核心:SKAttention选择性核注意力机制原理 + 实战全拆解

SKAttention的核心思想来源于人类视觉系统的一个重要特性:根据不同的视觉刺激,人眼能够自适应地调整感受野大小。SKAttention将这一生物学原理转化为深度学习中的注意力机制,通过动态选择和融合不同大小的卷积核,实现了自适应的多尺度特征提取。在人类视觉皮层中,不同的神经元具有不同大小的感受野,而且这些感受野的大小会根据视觉刺激的类型动态调整。本文将深入解析SKAttention模块的设计原理、数学基础、实现细节,以及其在YOLOv13目标检测框架中的集成应用,为读者提供全面而深入的技术理解。

FJN110的博客 97

9、JavaSE总结

1995年诞生:JavaSE、JavaME、JavaEE2006年Hadoop大数据系列。

nytcjsjboss的博客 248

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

JavaEE(1)

目录 1、java初步 计算机语言的发展历史 java简史 2、数据类型 3、运算符 4、控制流程 5、方法 6、数组 7、面向对象 8、异常 9、常用类 10、集合 11、IO流 12、多线程 13、网络编程 14、反射 15、JDBC 1、Java初步 计算机语言的发展历史 加法:1101------- 助记符 add ....load 计算机上----操作系统----屏蔽了人和计算机接触的障碍 c++:面向对象不彻底 真正意义上的第一

qq_45546075的博客 4632

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

假人有限元模型

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

java路径总结

我整理的一些关于【Java】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/bLN8S1Java路径总结:从基础到实践的探索 Java作为一种广泛应用的编程语言,因其跨平台性和强大的社区支持而备受欢迎。无论是开发桌面应用、移动应用,还是后端服务,Java都发挥着重要作用。本文...

weixin_40268912的博客 84

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Python基础学习笔记28——内置函数2

Python基础学习笔记。

CCH2024的专栏 253

19Linux基本使用和web程序部署

🌴 Linux和window一样是一个操作系统;🌴 Linux严格意义上来说只是一个操作系统内核,基于这个内核有很多不同的定制版本,如RedHat、CentOS;🌴 基础命令:为了节省资源和增加响应速度,服务器和嵌入式设备上的Linux都是通过命令行的方式进行操作的;🌴 系统编程&网络编程:可以在Linux系统下进行编程,也可以利用Socket来进行网络编程;🌴 部署JavaWeb项目: 我们可以将自己写的web程序、搭建的网站等发布到服务器上,这样所有人就都可以访问了;🌴 直接装在物理机上,但...

MacondoMayor的博客 599

2025 年 Java 校招 120 道含实操面试题目及答案完整合集

本文整理了Java校招常见的120道面试题及答案,包含基础概念与实操代码示例。第一部分涵盖Java基础,包括语言特点(面向对象、平台无关等)、JVM原理、static关键字、数据类型、方法重载与覆盖、构造方法、多继承限制、参数传递方式、进程线程区别以及线程创建方式。第二部分讲解多线程与并发,涉及线程同步实现(synchronized)、线程安全概念(对比ArrayList与Vector的线程安全性)等内容。每个知识点均配有简明理论解释和对应的Java代码实操演示,如面向对象示例、静态工具类实现、多接口应用等

sss191s的博客 1180

Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04中的Java与Android开发环境 (20)

本文详细介绍了在Ubuntu 22.04系统中配置Java开发环境的完整流程。主要内容包括:Java平台特性分析(跨平台、面向对象、自动内存管理等);JDK/JRE/JVM体系结构详解;OpenJDK和Oracle JDK的安装方法;多版本Java环境管理(包括版本切换和项目级配置);以及使用IntelliJ IDEA开发Java项目的安装指南。文章还提供了丰富的命令行操作示例,涵盖环境变量配置、版本切换工具使用等实用技巧,为开发者在Ubuntu系统上搭建完善的Java开发环境提供了全面指导。

qq_45746668的博客 775

Java新手必看:javac编译报错‘找不到符号‘的5种常见原因及解决方法

本文详细解析了Java新手在使用javac编译时常见的'找不到符号'错误,总结了5种主要原因及解决方法,包括拼写错误、包导入问题、类路径配置、作用域限制和编译顺序问题。通过具体代码示例和实用技巧,帮助开发者快速定位和解决这类编译错误,提升Java编程效率。

joy55的博客 205

FloodLight+Mininet安装及简单测试

FloodLight+Mininet安装及简单测试 系统采用vm下ubuntu16.04 一、前置依赖安装 sudo apt-get install build-essential ant maven python-dev sudo apt-get install git 二、配置orcal jdk 1、官网下载JDK文件,这里用的是如下版本 jdk-8u162-linux-x64.tar.g...

八月对半 2269

Java 学习系列(1):Java 语言入门

本篇博客介绍了 Java 语言的基础知识,包括 Java 的特点、安装 JDK、编写第一个 Java 程序,以及基本语法(变量、条件语句、循环语句等)。在接下来的文章中,我们将深入学习 Java 面向对象编程、集合框架、异常处理等核心内容,敬请期待!下一期:《Java 学习系列(2):面向对象编程(OOP)》

Azperk的博客 998

Java爬虫.HttpClient

1.HttpClient 网络爬虫就是用程序帮助我们访问网络上的资源。我们一直以来都是使用HTTP协议访问互联网的网页,网络爬虫需要编写程序,在这里使用相同的HTTP协议访问网页。 这里我们使用Java的HTTP协议客户端HttpClient这个技术,来实现抓取网页数据。 1.1 GET请求 访问csdn官网,请求url地址 https://www.youkuaiyun.com/ 见 HttpGetTest....

懂得一千零一种,赋予你失败的方法! 488

MemCache在tomcat中的负载均衡和session交叉存放

一.配置环境 1.安装jdk和tomcat并将其放至/usr/local目录下 [root@server1 ~]# ls [root@server1 ~]# tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local [root@server1 ~]# tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local 2.为...

qq_39376481的博客 362

Linux 系统报打开的文件过多

解决Linux打开文件数过多error:too many open files

baidu_35160588的博客 873

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 293
上一篇: VUE#(二)
下一篇: JavaWeb#(一) Servlet的认识
Stock01
博客等级 码龄6年 1粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值