网络编程

网络编程

网络的概念

网络通信

1.概念:两台设备之间通过网络实现数据传输;

2.网络通信:将数据通过网络从一台设备传输到另一台设备

3.java.net包下提供了一系列的类或接口,完成网络通信

网络编程

网络

1.概念:两台或多台设备通过一定物理设备连接起来构成了网络;

2.根据网络的覆盖范围不同,对网络进行分类:

​ 局域网:覆盖范围最小,仅仅覆盖一个教室或一个机房;

​ 城域网:覆盖范围较大,可以覆盖一个城市;

​ 广域网:覆盖范围最大,可以覆盖全国甚至全球,万维网是广域网的代表;

网络通信协议

协议(Tcp/Ip):在网络编程中,数据的组织形式就是协议;

Tcp/Ip(Transmission Control Protocol/Internet Protocol)的简写,

中文译名为 传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议,Internet国际互联网络的基础,简单的说,就是 由网络层的IP协议和传输层的TCP协议组成的

TCP网络通信编程

网络编程

实例:客户端向服务发送hello,server,使用 字节流

服务端:

package com.example.socket;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Author 郜庆辉
 * @Time 2022/6/10 14:57
 * @Version 1.0
 */
public class SocketTcp01Server {
    public static void main(String[] args) throws IOException {
        //1.在本机的9999端口监听,等待连接
        // 细节:要求在本机没有其他服务在监听9999
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务端在9999端口监听,等待连接...");
        //2.当没有客户端连接9999端口时,程序会阻塞,等待连接
        //如果有客户端连接,则会返回Socket对象,程序继续执行
        Socket socket = serverSocket.accept();
        System.out.println("服务端Socket返回=" + socket.getClass());
        //3.通过socket.getInputStream()读取客户端写入到数据通道的数据,显示
        InputStream inputStream = socket.getInputStream();

        //4.IO读取
        byte[] buf = new byte[1024];
        int readLine = 0;

        while ((readLine = inputStream.read(buf)) != -1){
            System.out.println(new String(buf,0,readLine));//根据读取到的实际长度显示为字符串

        }
        //5.关闭流和socket
        serverSocket.close();
        socket.close();
        inputStream.close();

    }
}

客户端:

package com.example.socket;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * @Author 郜庆辉
 * @Time 2022/6/10 15:02
 * @Version 1.0
 */
public class SocketTcp01Client {
    public static void main(String[] args) throws IOException {
        //思路:
        //1.连接客户端(ip,端口)
        //2.解读:连接本机的9999端口,如果不是本机,可以时域名或者时ip地址
        //如果连接成功,返回一个socket对象
        Socket socket = new Socket(InetAddress.getLocalHost(),9999);
        System.out.println("客户端Socket返回=" + socket.getClass());
        //3.通过输出流,写入数据到数据通道
        OutputStream outputStream = socket.getOutputStream();
        //解释:字符串.getBytes表示将一个字符串转成一个字节数组
        outputStream.write("hello,server".getBytes());

        //4.关闭流对象和socket,必须关闭
        outputStream.close();
        socket.close();
        System.out.println("客户端退出...");
    }
}

实例:客户端向服务发送hello,server,服务端向客户端发送hello,client,使用 字节流

客户端:

package com.example.socket2;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

/**
 * @Author 郜庆辉
 * @Time 2022/6/10 15:30
 * @Version 1.0
 */
public class SocketTcp02Client {
    public static void main(String[] args) throws IOException {

        //思路:
        //1.连接客户端(ip,端口)
        //2.解读:连接本机的8888端口,如果不是本机,可以是域名或者是ip地址
        //如果连接成功,返回一个socket对象
        Socket socket = new Socket(InetAddress.getLocalHost(), 8888);

        //3.通过输出流,写入数据到数据通道
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello,server".getBytes());

        //4.添加一个结束标记,通俗来说就是已经说完话了,如果没有会双方会一直等待继续输入
        socket.shutdownOutput();

        //5.通过socket.getInputStream()读取客户端写入到数据通道的数据,显示
        InputStream inputStream = socket.getInputStream();
        int readLine = 0;
        byte[] buf = new byte[1024];
        while ((readLine = inputStream.read(buf)) != -1){
            System.out.println(new String(buf,0,readLine));
        }

        //6.关闭流
        outputStream.close();
        inputStream.close();
        socket.close();

    }
}

服务端:

package com.example.socket2;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Author 郜庆辉
 * @Time 2022/6/10 15:30
 * @Version 1.0
 * 根据字节流实现双方通信
 */
public class SocketTcp02Server {
    public static void main(String[] args) throws IOException {
        //1.在本机的8888端口监听,等待连接
        // 细节:要求在本机没有其他服务在监听8888
        ServerSocket serverSocket = new ServerSocket(8888);

        //2.当没有客户端连接8888端口时,程序会阻塞,等待连接
        //如果有客户端连接,则会返回Socket对象,程序继续执行
        Socket socket = serverSocket.accept();

        //3.通过socket.getInputStream()读取客户端写入到数据通道的数据,显示
        InputStream inputStream = socket.getInputStream();

        //4.IO读取
        byte[] buf = new byte[1024];
        int readLine = 0;
        while ((readLine = inputStream.read(buf)) != -1){
            System.out.println(new String(buf,0,readLine));
        }

        //5.通过输出流,写入数据到数据通道
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello,client".getBytes());

        //6.添加一个结束标记,通俗来说就是已经说完话了,如果没有会双方会一直等待继续输入
        socket.shutdownOutput();

        //7.关闭流和socket
        serverSocket.close();
        socket.close();
        inputStream.close();
        outputStream.close();

    }
}

实例:客户端向服务发送hello,server,服务端向客户端发送hello,client,使用 字符流

package com.example.socket3;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Author 郜庆辉
 * @Time 2022/6/10 15:30
 * @Version 1.0
 * 根据字节流实现双方通信
 */
public class SocketTcp03Server {
    public static void main(String[] args) throws IOException {
        //1.在本机的8888端口监听,等待连接
        // 细节:要求在本机没有其他服务在监听8888
        ServerSocket serverSocket = new ServerSocket(8888);

        //2.当没有客户端连接8888端口时,程序会阻塞,等待连接
        //如果有客户端连接,则会返回Socket对象,程序继续执行
        Socket socket = serverSocket.accept();

        //3.通过socket.getInputStream()读取客户端写入到数据通道的数据,显示
        InputStream inputStream = socket.getInputStream();

        //使用字符流来读取
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        System.out.println(s);

        //5.通过输出流,写入数据到数据通道
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello,client 字符流");
        bufferedWriter.newLine();//插入一个换行符,表示写入的内容结束,注意:要求对方使用readLine()来读!!
        bufferedWriter.flush();//如果使用的是字符流需要手动刷新,否则数据不会写入数据通道

        //6.添加一个结束标记,通俗来说就是已经说完话了,如果没有会双方会一直等待继续输入
        socket.shutdownOutput();

        //7.关闭流和socket
        serverSocket.close();
        socket.close();
        bufferedReader.close();
        bufferedWriter.close();

    }
}

UDP网络通信编程

基本介绍:

  1. 类DatagramSocket和DatagramPacket[数据包/数据报]实现了基于UDP协议网络程序
  2. UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不确定什么时候可以抵达。
  3. DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号
  4. UDP协议中每个数据报都给出了完整的地址信息,因此无须简历发送方和接收方的连接

网络编程

实例:

UPD接收端:

package com.example.UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * @Author 郜庆辉
 * @Time 2022/6/11 17:06
 * @Version 1.0
 * UPD接收端
 */
public class UDPReceiverA {
    public static void main(String[] args) throws IOException {
        //1.创建一个DatagramSocket对象,准备在9999端口接收数据
        DatagramSocket socket = new DatagramSocket(9999);
        //2.构建一个DatagramPacket对象,准备接收数据
        byte[] bytes = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bytes,bytes.length);
        //3.调用接收方法,将通过网络传输的DatagramPacket对象填充到packet对象
        //注意:当有数据包发送到本机的9999端口时就会接收数据,没有数据报发送就阻塞等待
        System.out.println("接收端A等待接收数据");
        socket.receive(packet);
        //4.可以把packet进行拆包,取出数据并显示
        int length = packet.getLength();//实际收到的数据字节长度
        byte[] data = packet.getData(); //接收到的数据
        String s = new String(data, 0, length);
        System.out.println(s);

        //接收返回的数据好的明天见
        byte[] bytes1 = "好的明天见".getBytes();
        DatagramPacket packet1 = new DatagramPacket(bytes1,bytes1.length, InetAddress.getByName("169.254.115.195"),9998);
        socket.send(packet1);

        socket.close();
    }
}

UPD发送端:

package com.example.UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

/**
 * @Author 郜庆辉
 * @Time 2022/6/11 17:05
 * @Version 1.0
 * UPD发送端
 */
public class UDPsenderB {
    public static void main(String[] args) throws IOException {
        //1.创建一个DatagramSocket对象,准备在9998端口接接收
        DatagramSocket socket = new DatagramSocket(9998);

        //2.将需要发送的数据封装到DatagramPacket对象
        byte[] data = "明天吃火锅".getBytes();

        //说明:封装的DatagramPacket对象  data 内容字节数组,data.length  主机IP,端口
        DatagramPacket packet = new DatagramPacket(data,data.length, InetAddress.getByName("169.254.115.195"),9999);

        socket.send(packet);

        data = new byte[1024];
        DatagramPacket packet1 = new DatagramPacket(data,data.length);
        System.out.println("发送端B等待接收数据");
        socket.receive(packet1);

        int length = packet1.getLength();//实际收到的数据字节长度
        data = packet1.getData(); //接收到的数据
        String s = new String(data, 0, length);
        System.out.println(s);
        //关闭资源
        socket.close();
    }

}

Original: https://www.cnblogs.com/gaoqinghui/p/16390620.html
Author: 忧愁小松鼠
Title: 网络编程

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/569631/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java八大基本数据类与对应包装类

    Java的八种基本数据类型 序号 数据类型 字节数 默认值 取值范围 示例 1 byte (位) 1 0 -2^7 ~ 2^7-1 byte b = 10; 2 short (短整…

    Java 2023年6月5日
    064
  • 自己实现HashMap

    java;gutter:true; /*<em> * hashmap的demo * @author cuiyc * @version 1.0 * @date 2021/…

    Java 2023年6月5日
    067
  • SpringBoot + websocket 实现模拟设备上下线

    package com .example .demo .websocket ; import org .slf4j .Logger ; import org .slf4j .Log…

    Java 2023年5月30日
    065
  • myBatis plus 去除生成 controller

    ​ 由于我在网上没有找到答案, 所以分享给大家学习, 我也是第一次用 mybtis plus 的新生成器生成代码, 所以基础代码都是在官网复制所得. 在这里也支持大家在解决不了问题…

    Java 2023年6月7日
    085
  • 使用idea将整个项目打包为公共组件到本地maven库

    1、在idea工程右侧找到mavenproject Original: https://www.cnblogs.com/holly8/p/16642361.htmlAuthor: …

    Java 2023年6月14日
    075
  • 并发编程之:JUC并发控制工具

    大家好,我是小黑,一个在互联网苟且偷生的农民工。 在上一期我们讲了Thread.join()方法和CountDownLatch,这两者都可以做到等待一个线程执行完毕之后当前线程继续…

    Java 2023年6月7日
    0113
  • 设计模式介绍和单一职责原则

    设计模式的目的 编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的 挑战,设计模式是为了让程序(软件),具有更好 代码重用性 (即:…

    Java 2023年6月15日
    076
  • JavaWeb入门

    1.Web概念概述 JavaWeb:使用Java语言开发基于互联网的项目 1.1 软件架构 C/S:Client/Server 客户端、服务器端 在用户本地有一个客户端程序,在远程…

    Java 2023年6月6日
    081
  • java通过command调用openssl生成私钥和证书

    在windows环境下进行的测试,前提条件,windows上需要先安装openssl。 配置环境变量,查看版本: import java.io.*; import java.uti…

    Java 2023年5月29日
    083
  • 一种基于Java Swing/HTML/MySQL的汽车租赁系统

    该项目是一个Java的课程作业(大二),主要运用Java、Swing、HTML、MySQL,实现基本的租车逻辑、界面可视化、信息导出、数据存储等功能。实现管理员、用户两种角色登录,…

    Java 2023年6月5日
    088
  • spring boot集成RabbitMQ-SpringBoot(24)

    认识RabbitMQ 1.1介绍RabbitMQ RabbitMQ 是开源的高级消息队列协议(Advanced Message Queueing Protocol, AMQP) 的…

    Java 2023年6月13日
    083
  • 老徐和阿珍的故事:ArrayList和LinkedList的效率到底哪个高?

    人物背景:老徐,男,本名徐福贵,从事Java相关研发工作多年,职场老油条,摸鱼小能手,虽然岁数不大但长的比较着急,人称老徐。据说之前炒某币败光了所有家产,甚至现在还有欠债。阿珍,女…

    Java 2023年6月7日
    070
  • 让服务器apache/iis/nginx支持.apk/ipa文件下载

    IIS服务器不能下载.apk文件的原因:iis的默认MIME类型中没有.apk文件,所以无法下载。 IIS服务器不能下载.apk文件的解决办法:既然.apk无法下载是因为没有MIM…

    Java 2023年5月30日
    088
  • 《Java程序设计》课程实验要求

    《Java程序设计》课程实验要求 《Java程序设计》课程实验要求 注册实验楼账号 实验一 Java开发环境的熟悉 实验二《Java面向对象程序设计》 实验三 《敏捷开发与XP实践…

    Java 2023年5月29日
    091
  • java_序列化和反序列化

    1.序列化的作用: 序列化的原本意图是希望对一个Java对象作一下”变换”,变成字节序列,这样一来方便持久化存储到磁盘,避免程序运行结束后对象就从内存里消失…

    Java 2023年6月5日
    066
  • FileInputStream,OutputStreamWriter

    package com.gao.IO; import javax.xml.stream.FactoryConfigurationError; import java.io.*; p…

    Java 2023年6月5日
    086
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球