网络编程:IP,端口,URL,UDP协议,TCP协议

网络编程

1. IP

IP是用来定位互联网中的每一个节点,域名是IP的字符变现形式,通过DNS服务器实现这一功能。

注:192.168.0.0~192.168.255.255范围是非注册IP,供组织内部使用。

代码:

import java.net.InetAddress;
import java.net.UnknownHostException;
public class NetDemo01 {
    public static void main(String[] args) throws UnknownHostException {
        //getLocalHost() 返回本地主机的地址
        InetAddress id1 = InetAddress.getLocalHost();
        System.out.println(id1);
        //getHostName() 获取此IP地址的主机名
        System.out.println(id1.getHostName());
        //getLocalHost() 返回本地主机的地址
        System.out.println(id1.getHostAddress());
        //getByName​(String host) 根据主机名称确定主机的IP地址
        InetAddress id2 = InetAddress.getByName("www.jd.com");
        System.out.println(id2);
        System.out.println(id2.getHostName());
        System.out.println(id2.getHostAddress());
    }
}

2. 端口

端口是用来区分不同软件的,占2个字节,使用0~65535之间的整数表示,8000以内不建议使用,是预留端口号,同一个协议下端口号不能冲突。常见的端口号有以下几种:

  • 80:http协议
  • 8080:Tomcat服务器
  • 3306:MySQL数据库
  • 1521:Oracle数据库

代码:

import java.net.InetSocketAddress;
public class NetDemo02 {
    public static void main(String[] args) {
        InetSocketAddress i1 = new InetSocketAddress("localhost",9999);
        System.out.println(i1);
        //getPort() 获取端口号
        System.out.println(i1.getPort());
        //getAddress() 获取 InetAddress
        System.out.println(i1.getAddress());
        //getHostName() 获取 hostname
        System.out.println(i1.getHostName());
    }
}

3. URL

URL为统一资源定位符,是互联网的三大基石之一,另两个为http和html,由协议,域名,端口号,资源组成。

import java.net.MalformedURLException;
import java.net.URL;
public class NetDemo03 {
    public static void main(String[] args) throws MalformedURLException {
        URL url = new URL("http://www.baidu.com:80/index.html?username=zhangsan&pwd=123#a");
        System.out.println(url);
        //getFile() 获取此 URL的文件名
        System.out.println(url.getFile());
        //getHost() 获取此 URL的主机名(如果适用)
        System.out.println(url.getHost());
        //getPath() 获取此 URL的路径部分
        System.out.println(url.getPath());
        //getPort() 获取此 URL的端口号
        System.out.println(url.getPort());
        //getProtocol() 获取此 URL的协议名称
        System.out.println(url.getProtocol());
        //getQuery() 获取此 URL的查询部分
        System.out.println(url.getQuery());
        //getRef() 获取此 URL的锚点(也称为“引用”)
        System.out.println(url.getRef());
    }
}

4. UDP协议

UDP协议可以理解为发送短信,非面向连接,不安全,数据可能丢失,协议简单,效率高,大小有限制,一般不超过60K。

注:UDP协议是基于字节数组传输数据的。

注:Socket套接字相当于传输层为应用层开了一个小口子,TCP和UDP协议就是面向Socket编程,不同协议的Socket实现方式不同。

发送端代码:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class UDPDemo01 {
    public static void main(String[] args) throws IOException {
        System.out.println("我是发送端!!");
        // 1.定义我是发送端  DatagramSocket(int port)
        DatagramSocket client = new DatagramSocket(8888);
        // 2.准备数据
        String msg = "你好!!";
        byte[] arr = msg.getBytes();
        // 3.打包
        DatagramPacket packet = new DatagramPacket(arr,0,arr.length,new InetSocketAddress("localhost",9990));
        // 4.发送 send(DatagramPacket p) 从此套接字发送数据报包。
        client.send(packet);
        // 5.关闭资源
        client.close();
    }
}

接收端代码:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPDemo02 {
    public static void main(String[] args) throws IOException {
        System.out.println("我是接收端!!");
        // 1.定义我是接收端  DatagramSocket(int port) 构造一个数据报套接字并将其绑定到本地主机上的指定端口
        DatagramSocket server = new DatagramSocket(9990);
        // 2.准备包裹,用来接收数据
        byte[] arr = new byte[1024];
        DatagramPacket packet = new DatagramPacket(arr,0,arr.length);
        // 3.阻塞式接收数据 receive(DatagramPacket p) 从此套接字接收数据报包
        server.receive(packet);
        // 4.处理数据
        //getData() 返回数据缓冲区。
        //getLength() 返回要发送的数据的长度或接收的数据的长度。
        System.out.println(new String(packet.getData()));
        // 5.关闭资源
        server.close();
    }
}

5. TCP协议

TCP协议可以理解为打电话,面向连接,安全可靠,效率低,没有大小限制,基于三次握手。

注:TCP协议是基于字节流传输数据的。

客户端代码:

import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
public class TCPDemo01 {
    public static void main(String[] args) throws IOException {
        System.out.println("我是客户端!!");
        //1.定义客户端 Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号
        Socket client = new Socket("localhost",8585);
        //2.准备数据
        String msg = "你好!!";
        //3.获取输出流
        DataOutputStream out = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));
        //4.写出
        out.writeUTF(msg);
        //5.刷出
        out.flush();
        //6.关闭
        out.close();
        client.close();
    }
}

服务器代码:

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPDemo02 {
    public static void main(String[] args) throws IOException {
        System.out.println("我是服务器!!");
        //1.定义服务器  ServerSocket(int port) 创建绑定到指定端口的服务器套接字
        ServerSocket server = new ServerSocket(8585);
        //2.阻塞式监听 Socket accept() 侦听对此套接字的连接并接受它
        Socket client = server.accept();
        //3.获取输入流
        DataInputStream is = new DataInputStream(new BufferedInputStream(client.getInputStream()));
        //4.读取客户端传递的数据
        String msg = is.readUTF();
        //5.处理数据
        System.out.println(msg);
        //6.关闭
        is.close();
        client.close();
        server.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值