首页 > 编程语言 >Java网络编程

Java网络编程

时间:2022-08-19 22:12:14浏览次数:63  
标签:DatagramSocket Java 编程 网络 System println net 客户端 out

Java网络编程

Java为了可移植性,不允许直接调用操作系统,而是由java.net包来提供网络功能。Java虚拟机负责提供与操作系统的实际连接。以下是java.net包中的常用的类。

InetAddress

用于封装计算机的IP地址和DNS(没有端口信息)。

这个类没有构造方法。如果要得到对象,只能通过静态方法:

  • getLocalHost()
  • getByName()
  • getAllByName()
  • getAllByName()
  • getHostName()

示例:

import java.net.InetAddress;
import java.net.UnknownHostException;
public class Test1 {
    public static void main(String[] args) throws UnknownHostException {
        //使用getLocalHost方法创建InetAddress对象
        InetAddress addr = InetAddress.getLocalHost();
        //返回IP地址:192.168.1.110
        System.out.println(addr.getHostAddress()); 
        //输出计算机名:gaoqi
        System.out.println(addr.getHostName());
        
        //根据域名得到InetAddress对象
        InetAddress addr = InetAddress.getByName("www.sxt.cn");
        // 返回 sxt服务器的IP:59.110.14.7
        System.out.println(addr.getHostAddress());
        // 输出:www.sxt.cn
        System.out.println(addr.getHostName());
        
        //根据IP得到InetAddress对象
        InetAddress addr = InetAddress.getByName("59.110.14.7");
        // 返回sxt服务器的IP:59.110.14.7
        System.out.println(addr.getHostAddress());
        /*
         * 输出ip而不是域名。如果这个IP地址不存在或DNS服务器不允许进行IP地址
         * 和域名的映射,getHostName方法就直接返回这个IP地址。
         */
        System.out.println(addr.getHostName());
        
    }
}

InetSocketAddress

包含IP和端口信息,常用于Socket通信。此类实现 IP 套接字地址(IP 地址 + 端口号),不依赖任何协议。

使用示例:

import java.net.InetSocketAddress;
public class Test4 {
    public static void main(String[] args) {
        InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8080);
        InetSocketAddress socketAddress2 = new InetSocketAddress("localhost", 9000);
        System.out.println(socketAddress.getHostName());
        System.out.println(socketAddress2.getAddress());
    }
}

URL

为了方便程序员编程,JDK中提供了URL类,该类的全名是java.net.URL,有了这样一个类,就可以使用它的各种方法来对URL对象进行分割、合并等处理。

使用示例:

import java.net.MalformedURLException;
import java.net.URL;
public class Test5 {
    public static void main(String[] args) throws MalformedURLException {
        URL u = new URL("http://www.google.cn:80/webhp#aa?canhu=33");
        System.out.println("获取与此url关联的协议的默认端口:" + u.getDefaultPort());
        System.out.println("getFile:" + u.getFile()); // 端口号后面的内容
        System.out.println("主机名:" + u.getHost()); // www.google.cn
        System.out.println("路径:" + u.getPath()); // 端口号后,参数前的内容
        // 如果www.google.cn:80则返回80.否则返回-1
        System.out.println("端口:" + u.getPort()); 
        System.out.println("协议:" + u.getProtocol());
        System.out.println("参数部分:" + u.getQuery());
        System.out.println("锚点:" + u.getRef());
 
        URL u1 = new URL("http://www.abc.com/aa/");
        URL u2 = new URL(u, "2.html"); // 相对路径构建url对象
        System.out.println(u2.toString()); // http://www.abc.com/aa/2.html
    }
}

UDP编程

UDP通信编程基本步骤:

  1. 创建客户端的DatagramSocket,创建时,定义客户端的监听端口。
  2. 创建服务器端的DatagramSocket,创建时,定义服务器端的监听端口。
  3. 在服务器端定义DatagramPacket对象,封装待发送的数据包。
  4. 客户端将数据报包发送出去。
  5. 服务器端接收数据报包。

DatagramSocket:用于发送或接收数据报包

当服务器要向客户端发送数据时,需要在服务器端产生一个DatagramSocket对象,在客户端产生一个DatagramSocket对象。服务器端的DatagramSocket将DatagramPacket发送到网络上,然后被客户端的DatagramSocket接收。

DatagramSocket有两种常用的构造函数。一种是无需任何参数的,常用于客户端;另一种需要指定端口,常用于服务器端:

  • DatagramSocket() :构造数据报套接字并将其绑定到本地主机上任何可用的端口。
  • DatagramSocket(int port) :创建数据报套接字并将其绑定到本地主机上的指定端口。

常用方法:

  • send(DatagramPacket p) :从此套接字发送数据报包。
  • receive(DatagramPacket p) :从此套接字接收数据报包。
  • close() :关闭此数据报套接字。

DatagramPacket:数据容器(封包)的作用

此类表示数据报包。 数据报包用来实现封包的功能。

常用方法:

  • DatagramPacket(byte[] buf, int length) :构造数据报包,用来接收长度为 length 的数据包。
  • DatagramPacket(byte[] buf, int length, InetAddress address, int port) :构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
  • getAddress() :获取发送或接收方计算机的IP地址,此数据报将要发往该机器或者是从该机器接收到的。
  • getData() :获取发送或接收的数据。
  • setData(byte[] buf) :设置发送的数据。

示例:

//单向通信-客户端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
 
public class Client {
    public static void main(String[] args) throws Exception {
        byte[] b = "北京尚学堂".getBytes();
        //必须告诉数据报包要发到哪台计算机的哪个端口,发送的数据以及数据的长度
        DatagramPacket dp = new DatagramPacket(b,b.length,new 
InetSocketAddress("localhost",8999));
        //创建数据报套接字:指定发送信息的端口
        DatagramSocket ds = new DatagramSocket(9000);
        //发送数据报包
        ds.send(dp);
        //关闭资源
        ds.close();
    }
}
//单向通信-服务端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
 
public class Server {
    public static void main(String[] args) throws Exception {
        //创建数据报套接字:指定接收信息的端口
        DatagramSocket ds = new DatagramSocket(8999);
        byte[] b = new byte[1024];
        //创建数据报包,指定要接收的数据的缓存位置和长度
        DatagramPacket dp = new DatagramPacket(b, b.length);
        //接收客户端发送的数据报
        ds.receive(dp); // 阻塞式方法
        //dp.getLength()返回实际收到的数据的字节数
        String string = new String(dp.getData(), 0, dp.getLength());
        System.out.println(string);
        //关闭资源
        ds.close();
    }
}

TCP编程

在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序,简称服务器。一旦通讯建立,则客户端和服务器端完全一样,没有本质的区别。

“请求-响应”模式:

  • Socket类:发送TCP消息。
  • ServerSocket类:创建服务器。

在客户端和服务器中,分别创建独立的Socket,并通过Socket的属性,将两个Socket进行连接,这样,客户端和服务器通过套接字所建立的连接使用输入输出流进行通信。

通过Socket的编程顺序:

  1. 创建服务器ServerSocket,在创建时,定义ServerSocket的监听端口(在这个端口接收客户端发来的消息)。
  2. ServerSocket调用accept()方法,使之处于阻塞状态。
  3. 创建客户端Socket,并设置服务器的IP及端口。
  4. 客户端发出连接请求,建立连接。
  5. 分别取得服务器和客户端Socket的InputStream和OutputStream。
  6. 利用Socket和ServerSocket进行数据传输。
  7. 关闭流及Socket。

标签:DatagramSocket,Java,编程,网络,System,println,net,客户端,out
From: https://www.cnblogs.com/AncilunKiang/p/16603460.html

相关文章

  • 生成JavaDoc
    1.第一步:首先创建一个新的文件夹。2.第二步:选中所要生成的包。3.第三步:点击键盘shift两下,搜索tools,并选择生成javadoc(GenerateJavaDoc)这个选项。4.第四部:红色圈的都......
  • JavaSE——Properties集合
    Properties集合Properties作为Map集合的使用介绍:是一个Map体系的集合类Properties可以保存到流中或从流中加载属性列表中的每个键及其对应的值都是一个字符串基本......
  • 16-java面向对象
    面向对象构造器--快捷键:alt+insert快速生产构造器构造器:和类名相同没有返回值作用:new本质在调用构造方法初始化对象的值注意点:定义有参构造后......
  • Java SE 12 新增特性
    JavaSE12新增特性作者:Grey原文地址:JavaSE12新增特性源码源仓库:Github:java_new_features镜像仓库:GitCode:java_new_featuresString类中新增的APIJavaSE......
  • 网络编程-TCP通信程序(上)理论
    TCP通信程序概述 TCP通信能实现两台计算机之间的数据交互通信的两端要严格区分客户端(Client)与服务端(Server)两端通信时步骤1.服务端程序需要事先启动等待客户端的链......
  • Java开发-新的包和类
    JAVA日期类演变:Date→Calendar→LocalDate【年月日】LocalTime【时分秒】 LocalDateTime【年月日时分秒】是在JDK8引入参考文档:JAVA日期类......
  • 2022-08-19 田龙跃 JAVAWEB项目(小论坛)
    JAVA小项目E-R图个人理解:E-R图中每个实体到我们对java中就是一个domin类,字段就是属性流程图注册流程图登录流程图JSTL标签jstl表达式:表达式的用法也是见名知义(和......
  • 15-java数组
    数组......
  • Java 中的线程池
    线程池·语雀(yuque.com)为什么要用线程池在HotSpotVM的线程模型中,Java线程被一对一映射为内核线程。Java在使用线程执行程序时,需要调用操作系统内核的API,创建......
  • JAVA里的注释
    JAVA里的注释编写代码时,代码量较少的情况下,我们还是可以看懂自己写的内容;但是当项目结构复杂起来,我们就需要用到注释注释不会被运行,只是给程序员看的书写注释是一个非......