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

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

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

                                                           TCP和UDP的分界线

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

(2)UDP协议:(速度快,无连接,不可靠)

不需要建立连接(因为把数据源IP、目的地IP、端口封装成数据包),每个数据包在64KB内,只管发,不管对方有没有接到确认什么的。

优点:可以广播发送,发送数据结束时无需释放资源,开销小,速度快。

使用场景:语言通话、视频通话等。

ps:这个就是一股脑的什么都封装一起,直接往外抛就什么都不管了,当然快了。

例子:

一收一发

发送端(客户端)

package bao;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Test {
    public static void main(String[] args) throws Exception {
        //一、发送端(测试时候先启动接收再发送端)
        //1.创建发送端对象,发送端自带默认端口号(人)
        System.out.println("========客户端启动============");
        DatagramSocket socket1 = new DatagramSocket();//不定义就默认端口
        //2.创建一个要发送的数据容器(容器里面有数据)
        byte[] a ="我是水".getBytes();
        //3.创建一个数据包对象把容器装起来
        DatagramPacket packet1 = new DatagramPacket(a,a.length, InetAddress.getLocalHost(),8899);//数据,大小,服务端的IP,服务端的端口
        //4.发送出去
        socket1.send(packet1);
        //5.关闭资源,避免资源浪费
       socket1.close();
    }
}

接收端 (服务端)

package bao;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Test1 {
    public static void main(String[] args) throws Exception {
        //二、接收端(测试时候先启动接收再发送端)
        //1.创建接收端对象,注册端口(人)
        System.out.println("=========接收端启动===============");
        DatagramSocket socket2 = new DatagramSocket(8899);
        //2.创建一个要接收的数据容器(等待接收数据)
        byte[]b =new byte[1024*64];
        //3.把容器数据打包
        DatagramPacket packet2 = new DatagramPacket(b,b.length);
        //4.等待接收数据
        socket2.receive(packet2);
        //5.读取多少倒出多少
        int len = packet2.getLength();
        String rs = new String(b,0,len);
        System.out.println("接收到了数据了"+rs);
        //6.关闭资源,避免资源浪费
        socket2.close();
    }
}
//额外知识点,获取对方端口和ip地址
//String ip = packet2.getAddress().toString();
//System.out.println("对方IP地址为"+ip);
//int port = packet2.getPort();
//System.out.println("对方端口位置"+port);

运行结果:

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

=========接收端启动===============

接收到了数据了我是水

多收多发

思想:把一收一发代码拿来改进就好了

发送端:把主要发送的代码写入死循环并写一个键盘输入代码,只有用户输入exit才能退出循环。

接收端:把等待接收的封装包开始写入死循环里面,然后再把释放资源的代码注释掉才能一直接收

发送端(客户端)

package bao;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
//发送端
public class Test {
    public static void main(String[] args) throws Exception {
        //一、1.创建发送端对象,发送端自带默认端口号(人)
        DatagramSocket socket1 = new DatagramSocket();//不定义就默认端口
        System.out.println("========客户端启动============");
        //二.6创建键盘录入
        Scanner sc = new Scanner(System.in);
        while (true) {//二、5.死循环把代码封起来(多收多发步骤)
            //二、6.接收键盘录入
            System.out.println("请输入:");
            String msg = sc.nextLine();
            //二、7.设置exit退出
            if ("exit".equals(msg)){
                System.out.println("离线成功");
                socket1.close();//释放资源
                break;
            }
            //2.创建一个要发送的数据容器(容器里面有数据)
            byte[] a =msg.getBytes();
            //3.创建一个数据包对象把容器装起来
            DatagramPacket packet1 = new DatagramPacket(a,a.length, InetAddress.getLocalHost(),8899);//数据,大小,服务端的IP,服务端的端口
            //4.发送出去
            socket1.send(packet1);
        }
    }
}

接收端 (服务端)

package bao;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
//二、接收端
public class Test1 {
    public static void main(String[] args) throws Exception {
        //1.创建接收端对象,注册端口(人)
        System.out.println("=========接收端启动===============");
        DatagramSocket socket2 = new DatagramSocket(8899);
        //2.创建一个要接收的数据容器(等待接收数据)
        byte[]b =new byte[1024*64];
        //3.把容器数据打包
        DatagramPacket packet2 = new DatagramPacket(b,b.length);
        while (true) {//二、6.把封装代码写入死循环并删掉释放资源的代码(多收多发步骤)
            //4.等待接收数据
            socket2.receive(packet2);
            //5.读取多少倒出多少
            int len = packet2.getLength();
            String rs = new String(b,0,len);
            System.out.println("接收到了来自:"+packet2.getAddress()+"对方端口是:"+packet2.getPort()+rs);
        }
    }
}
//额外知识点,获取对方端口和ip地址
//String ip = packet2.getAddress().toString();
//System.out.println("对方IP地址为"+ip);
//int port = packet2.getPort();
//System.out.println("对方端口位置"+port);

运行结果:

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

请输入:

你在吗

请输入:

在干嘛

请输入:

=========接收端启动===============

接收到了来自:(隐私不展示)对方端口是:(隐私不展示)你在吗

接收到了来自:(隐私不展示)对方端口是:(隐私不展示)在干嘛

多开客户端 步骤

一台主机中可以创建很多个客户端给接收端发消息

1.在客户端的页面右上角点击

2.找到Allow multiple instances勾选完成

广播(当前主机和所在网络中的所有主机通信)

步骤:(前提在同一网段内)

发送端的参数地址指定为255.255.255.255,并且指定端口:例如6666

接收端的参数端口只要匹配成功就可以了,例如:6666

例子:

发送端

//修改前
 //3.创建一个数据包对象把容器装起来
DatagramPacket packet1 = new DatagramPacket(a,a.length, InetAddress.getLocalHost(),8899);//数据,大小,服务端的IP,服务端的端口
//修改后
 //3.创建一个数据包对象把容器装起来
DatagramPacket packet1 = new DatagramPacket(a,a.length, InetAddress.getByName("255.255.255.255"),6666);//数据,大小,服务端的IP,服务端的端口

接收端

//修改前
        //1.创建接收端对象,注册端口(人)
System.out.println("=========接收端启动===============");
DatagramSocket socket2 = new DatagramSocket(8899);
//修改后
        //1.创建接收端对象,注册端口(人)
System.out.println("=========接收端启动===============");
DatagramSocket socket2 = new DatagramSocket(6666);

组播 (当前主机和所在网络中的一组主机通信)

发送端和接收端都要用MulticastSocket绑定同一个IP地址和绑定同一个端口

范围:224.0.0.0~~~~239.255.255.255

发送端

//修改前
            //3.创建一个数据包对象把容器装起来
DatagramPacket packet1 = new DatagramPacket(a,a.length, InetAddress.getByName("255.255.255.255"),6666);//数据,大小,服务端的IP,服务端的端口
//修改后
            //3.创建一个数据包对象把容器装起来
DatagramPacket packet1 = new DatagramPacket(a,a.length, InetAddress.getByName("224.0.1.1"),6666);//数据,大小,服务端的IP,服务端的端口

接收端

//修改前
         //1.创建接收端对象,注册端口(人)
System.out.println("=========接收端启动===============");
DatagramSocket socket2 = new DatagramSocket(6666);
//修改后
        //1.创建接收端对象,注册端口(人)
System.out.println("=========接收端启动===============");
MulticastSocket socket2 = new MulticastSocket(6666);
//绑定组播IP(JDK开始过时的API)
socket2.joinGroup(InetAddress.getByName("224.0.1.1"));

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