Java 网络编程(大全)(上)

简介: 客户端是需要程序员去开发的,例如日常使用的各种的APP,服务端就是服务器。例子:端游,依赖特定的PC端才能玩。

一、1网络通信的基本模式分为两种

1.CS模式(Client---客户端,Server---服务端)

客户端是需要程序员去开发的,例如日常使用的各种的APP,服务端就是服务器。

例子:端游,依赖特定的PC端才能玩。

2.BS模式(Browser---浏览器,Server---服务端)---重点学习

服务端是需要程序员去开发的。浏览器就是我们日常使用的浏览器去访问各种网站,只要有浏览器就可以访问,不依赖特定的PC端,在任意设备上都可以访问网站服务器 。

例子:网页小游戏,联网浏览器就可以玩。

一、2 请分析C/S和B/S架构相比的各自的优缺点?

1.CS(客户端--服务器结构)

例子:网页小游戏,联网浏览器就可以玩。

一、2 请分析C/S和B/S架构相比的各自的优缺点?

1.CS(客户端--服务器

优点技术成熟,交互性强,网络通信量低,响应数据快。将任务分到了两端,降低了系统的开销。客户端要处理大多数的业务逻辑和UI展示。他是胖客户端。

缺点:更新太快,要求用户有相同的操作系统,如果有不同的操作系统还要开发不同的版本,对于计算机电脑的配置要求也高结构)

2。BS(浏览器-服务器结构)

优点:主要事务在服务端实现。分布性强、维护方便、开发简单

共享性强、总体成本低,对客户端的电脑配置要求较低

缺点:数据安全性问题,对服务器要求高。数据传输速度较慢,软件的个性化明显降低,难以实现传统模式下的特殊功能要求,他是瘦客户端,大量的数据的传输都要通过服务器与浏览器进行交互,通信开销大,难以实现复杂的应用构造

二、实现网络编程的三种要素

IP地址可以理解为具体哪个计算机,端口理解计算机上的程序(一个程序一个端口),协议理解为电脑通过什么方式和外界交互

要素一:IP地址:设备在网络中的地址,是唯一的标识

详解:

(1)常见的IP分类为:

IPv4(32比特4字节)和IPv6(128位16个字节)--称号--可以标记地球上的每一粒沙子。

(2)IP地址的取经之路:

计算机:我要去找百度获取数据。

DNS服务器:发过来我看看哪个网址域名啊,给你指路具体的ip地址

计算机:知道了这个ip地址,我就可以去找具体要访问的服务器了

服务器:计算机老弟你来找我了啊,那我把你要的数据发给你吧。

(3)公网地址和私有地址(局域网使用)

192.168开头的就是常见的私有地址

(4)获取IP地址的代码

要去实现这个IP地址的获取就要用到 InetAddress方法

代码例子:

package bao;
import java.net.InetAddress;
public class Test {
    public static void main(String[] args) throws Exception {
        //1.获取本机地址ip对象
        InetAddress ip1 = InetAddress.getLocalHost();
        System.out.println(ip1.getHostName());//获取主机名字
        System.out.println(ip1.getHostAddress());//获取ip地址
        //2.获取域名ip对象
        InetAddress ip2 = InetAddress.getByName("www.baidu.com");
        System.out.println(ip2.getHostName());//获取域名
        System.out.println(ip2.getHostAddress());//获取域名的ip地址
        //3.获取公网对象
        InetAddress ip3 = InetAddress.getByName("112.80.248.76");
        System.out.println(ip3.getHostName());//获取公网名字
        System.out.println(ip3.getHostAddress());//获取公网ip地址
        //判断网络是否能连接通信 ping 5s之前测试是否能通过
        System.out.println(ip3.isReachable(5000));//通过会返回true
    }
}

运行结果:

涉及到个人隐私就不放到这里来了,可以自己运行试试看  

=====================================================

要素二:端口:应用程序在设备中的唯一标识

一个主机设备中,端口号是唯一的

(1)端口号:一个程序一个端口号,被规定为16位的二进制,范围是0~65535

(2)周知端口:0~1023,被预先定义的知名应用占用。(例如:HTTP占用80端口,FTP占用21端口)

(3)注册端口:1024~49151,分配给用户进程或某些程序(例如:Tomcat占用8080端口)

(4)动态端口:49152~65535,不固定分配到某种进程,动态分配

=====================================================

要素三:协议:数据在网络中的传输协议,最常见的有UDP和TCP(重点)

(1)TCP协议: (安全,有连接确认可靠)

使用TCP协议,双方必须先建立连接,它是一种面向连接可靠通信协议,传输前,要建立三次握手方式建立连接确认。连接和发送数据都需要确认。传输完成后,还需要释放已连接的通信,通信效率相对比较低。

使用场景:对安全需求较高的文件下载、金融数据通信等。

三次握手连接:

客户端:在吗?

服务端:在

客户端:上号

四次握手断开连接:

客户端:不玩了

服务端:好吧

服务端:下次什么时候玩?

客户端:有空再玩

例子:

一收一发

发送端(客户端)

package bao;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
//发送端
public class Test {
    public static void main(String[] args) throws IOException {
        System.out.println("==============客户端启动===============");
        //1.创建发送通信管道
        Socket socket = new Socket("127.0.0.1",7777);//参数一:服务端地址 参数二:服务端端口
        //2.从scoket管道中获得一个字节输出流,负责发送数据
        OutputStream os = socket.getOutputStream();
        //3.字节流升级成打印流
        PrintStream ps = new PrintStream(os);
        //4.发送消息
        ps.println("大哥,我来了");
        ps.flush();//刷新
    }
}

接收端 (服务端)

package bao;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
//服务端
public class Test1 {
    public static void main(String[] args) throws IOException {
        System.out.println("========服务端启动============");
        //1.创建接收管道,注册端口
        ServerSocket serverSocket = new ServerSocket(7777);//参数一:定义服务端口
        //2.等待管道连接
        Socket accept = serverSocket.accept();
        //3.从管道中获取一个字节输入流
        InputStream is = accept.getInputStream();
        //4.字节流升级生缓冲输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        //5.按照行读取消息会更好
        String a;
        if ((a = br.readLine())!=null){
            System.out.println(accept.getRemoteSocketAddress()+"说了:"+a);
        }
    }
}

运行结果:

/127.0.0.1:60316说了:大哥,我来了

==============客户端启动===============

多收多发

发送端(客户端)

package bao;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
public class kehu {
    public static void main(String[] args) throws Exception {
        System.out.println("客户端启动");
        //1.创建与服务端连接的管道
        Socket s = new Socket(InetAddress.getLocalHost(), 9966);
        //2.创建一个线程负责客户端的消息读取
        new ClientReaderThread(s).start();
        //3.创建一个字节输入流管道
        OutputStream o = s.getOutputStream();
        PrintStream p = new PrintStream(o);//升级流
        //4.客户端输入数据
        Scanner sc = new Scanner(System.in);
        while (true){
            System.out.println("请输入:");
            String s1 = sc.nextLine();
            p.println(s1);//发送数据出去
            p.flush();//刷新流
        }
    }
}
class ClientReaderThread extends Thread{
    private Socket socket;
    public ClientReaderThread(Socket socket){
        this.socket = socket;
    }
        @Override
        public void run(){
            try {
                //把字节输入流包装成字符输入流
                InputStream i = socket.getInputStream();
                BufferedReader b = new BufferedReader(new InputStreamReader(i));
                String s1;
                while (true){
                    if ((s1=b.readLine())!=null){
                        System.out.println("收到了消息"+s1);
                    }
                }
            } catch (IOException e) {
                System.out.println("服务器把你提出群聊");
            }
        }
    }

 接收端 (服务端)

package bao;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class fuwu {
    //1.定义一个静态变量储存全部管道
    public static List<Socket> all_Sockets = new ArrayList<>();
    public static void main(String[] args) throws IOException {
        System.out.println("服务端启动成功");
        //2.服务端口注册
        ServerSocket ss = new ServerSocket(9966);
        //3.管道死循环设置
        while (true){
            Socket s = ss.accept();
            System.out.println(s.getRemoteSocketAddress()+"上线了");
            all_Sockets.add(s);
            new fuwuThread(s).start();
        }
    }
}
class fuwuThread extends Thread{
    private Socket socket;
    public fuwuThread(Socket socket){
        this.socket=socket;
    }
    @Override
    public void run(){
        try {
            InputStream i = socket.getInputStream();
            BufferedReader b = new BufferedReader(new InputStreamReader(i));
            String s1;
            while ((s1=b.readLine())!=null){
                System.out.println(socket.getRemoteSocketAddress()+"说"+s1);
                sendMessage(s1);
            }
        } catch (IOException e) {
            System.out.println(socket.getRemoteSocketAddress()+"离线了");
            fuwu.all_Sockets.remove(socket);
        }
    }
    private void sendMessage (String s1) throws IOException {
        for (Socket s:fuwu.all_Sockets){
            OutputStream o = s.getOutputStream();
            PrintStream p = new PrintStream(o);
            p.println(s1);
            p.flush();
        }
    }
}

运行结果:

服务端启动成功

/192.168.78.1:56384上线了

/192.168.78.1:56384说大哥

/192.168.78.1:56389上线了

/192.168.78.1:56389说小弟

/192.168.78.1:56384说

/192.168.78.1:56384说大哥11

客户端启动

请输入:

大哥

请输入:

收到了消息大哥

收到了消息小弟

大哥11

请输入:

请输入:

收到了消息

收到了消息大哥11

客户端启动

请输入:

小弟

请输入:

收到了消息小弟

收到了消息

收到了消息大哥11

目录
相关文章
|
10月前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
224 11
|
2月前
|
JSON 移动开发 网络协议
Java网络编程:Socket通信与HTTP客户端
本文全面讲解Java网络编程,涵盖TCP与UDP协议区别、Socket编程、HTTP客户端开发及实战案例,助你掌握实时通信、文件传输、聊天应用等场景,附性能优化与面试高频问题解析。
|
12天前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
59 1
|
12天前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
52 1
|
15天前
|
机器学习/深度学习 分布式计算 Java
Java与图神经网络:构建企业级知识图谱与智能推理系统
图神经网络(GNN)作为处理非欧几里得数据的前沿技术,正成为企业知识管理和智能推理的核心引擎。本文深入探讨如何在Java生态中构建基于GNN的知识图谱系统,涵盖从图数据建模、GNN模型集成、分布式图计算到实时推理的全流程。通过具体的代码实现和架构设计,展示如何将先进的图神经网络技术融入传统Java企业应用,为构建下一代智能决策系统提供完整解决方案。
183 0
|
11月前
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
219 9
|
7月前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
272 23
|
8月前
|
安全 网络协议 Java
Java网络编程封装
Java网络编程封装原理旨在隐藏底层通信细节,提供简洁、安全的高层接口。通过简化开发、提高安全性和增强可维护性,封装使开发者能更高效地进行网络应用开发。常见的封装层次包括套接字层(如Socket和ServerSocket类),以及更高层次的HTTP请求封装(如RestTemplate)。示例代码展示了如何使用RestTemplate简化HTTP请求的发送与处理,确保代码清晰易维护。
|
8月前
|
缓存 网络协议 Java
JAVA网络IO之NIO/BIO
本文介绍了Java网络编程的基础与历史演进,重点阐述了IO和Socket的概念。Java的IO分为设备和接口两部分,通过流、字节、字符等方式实现与外部的交互。
248 0
|
11月前
|
网络协议 Java 物联网
Java网络编程知识点
Java网络编程知识点
147 13