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

本文涉及的产品
.cn 域名,1个 12个月
简介: 客户端是需要程序员去开发的,例如日常使用的各种的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

目录
相关文章
|
19天前
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
44 9
|
19天前
|
人工智能 Java 物联网
JAVA网络编程的未来:URL与URLConnection的无限可能,你准备好了吗?
随着技术的发展和互联网的普及,JAVA网络编程迎来新的机遇。本文通过案例分析,探讨URL与URLConnection在智能API调用和实时数据流处理中的关键作用,展望其未来趋势和潜力。
40 7
|
3月前
|
Java
【思维导图】JAVA网络编程思维升级:URL与URLConnection的逻辑梳理,助你一臂之力!
【思维导图】JAVA网络编程思维升级:URL与URLConnection的逻辑梳理,助你一臂之力!
56 1
|
3月前
|
XML JSON 搜索推荐
【高手过招】JAVA网络编程对决:URL与URLConnection的高级玩法,你敢挑战吗?
【高手过招】JAVA网络编程对决:URL与URLConnection的高级玩法,你敢挑战吗?
66 0
|
19天前
|
Java 开发者
JAVA高手必备:URL与URLConnection,解锁网络资源的终极秘籍!
在Java网络编程中,URL和URLConnection是两大关键技术,能够帮助开发者轻松处理网络资源。本文通过两个案例,深入解析了如何使用URL和URLConnection从网站抓取数据和发送POST请求上传数据,助力你成为真正的JAVA高手。
38 11
|
19天前
|
安全 Java API
深入探索Java网络编程中的HttpURLConnection:从基础到进阶
本文介绍了Java网络编程中HttpURLConnection的高级特性,包括灵活使用不同HTTP方法、处理重定向、管理Cookie、优化安全性以及处理大文件上传和下载。通过解答五个常见问题,帮助开发者提升网络编程的效率和安全性。
|
19天前
|
JSON 安全 算法
JAVA网络编程中的URL与URLConnection:那些你不知道的秘密!
在Java网络编程中,URL与URLConnection是连接网络资源的两大基石。本文通过问题解答形式,揭示了它们的深层秘密,包括特殊字符处理、请求头设置、响应体读取、支持的HTTP方法及性能优化技巧,帮助你掌握高效、安全的网络编程技能。
43 9
|
19天前
|
JSON Java API
JAVA网络编程新纪元:URL与URLConnection的神级运用,你真的会了吗?
本文深入探讨了Java网络编程中URL和URLConnection的高级应用,通过示例代码展示了如何解析URL、发送GET请求并读取响应内容。文章挑战了传统认知,帮助读者更好地理解和运用这两个基础组件,提升网络编程能力。
40 5
|
23天前
|
Java
[Java]Socket套接字(网络编程入门)
本文介绍了基于Java Socket实现的一对一和多对多聊天模式。一对一模式通过Server和Client类实现简单的消息收发;多对多模式则通过Server类维护客户端集合,并使用多线程实现实时消息广播。文章旨在帮助读者理解Socket的基本原理和应用。
19 1
|
1月前
|
安全 网络协议 Java
Java 网络编程详解
《Java网络编程详解》深入浅出地讲解了使用Java进行网络编程的技术和方法。从基础的网络协议介绍到核心的Socket编程,以及高级的NIO与多线程应用,帮助读者全面掌握Java网络编程技能,是Java开发者不可或缺的学习指南。