java网络编程知识点:IP地址,TCP,UDP

网络编程

ip获取类(InetAddress)

java.net包下

新知:

:此类会抛出异常:UnknownHostException,需要处理。

1.InetAddress类,没有构造方法,类中方法都是静态的,可以直接用类名调用方法。

2.此类最重要的功能是获取IP地址,无论是本机还是网站的ip。

3.获取本机ip的方法有三种:

1.getByName("127.0.0.1"):确定主机名称的IP地址。 
2.getByName("localhost")
3.getLocalHost():返回本地主机的地址。

4.获取网站ip地址:

getByName("www.baidu.com");

5.获取域名的方法:

inetAddress.getHostName()

6.获取ip的方法:

inetAddress.getHostAddress()

1.查询本机地址

import java.net.InetAddress;
import java.net.UnknownHostException;

public class N01 {
    public static void main(String[] args) throws UnknownHostException {

        //有三种查询本机地址的参数:1: 127.0.0.1 / 2:localhost / 3:getLocalHost()方法
        InetAddress inetAddress1=InetAddress.getByName("127.0.0.1");
        System.out.println("第一种:"+inetAddress1);
        System.out.println("第二种:"+InetAddress.getByName("localhost"));
        System.out.println("第三种:"+InetAddress.getLocalHost());//getLocalHost()返回本地主机的地址。

    }

}
结果:
    第一种:/127.0.0.1
    第二种:localhost/127.0.0.1
    第三种:DESKTOP-K2F3HTO/192.168.137.1

2.查询网站ip地址

import java.net.InetAddress;
import java.net.UnknownHostException;

public class N01 {
    public static void main(String[] args) throws UnknownHostException {
        InetAddress inetAddress=InetAddress.getByName("www.baidu.com");
        System.out.println("获取百度的IP地址:"+inetAddress);
        System.out.println("获取域名的方法:"+inetAddress.getHostName());
        System.out.println("获取ip的方法"+inetAddress.getHostAddress());
    }

}
结果:
    获取百度的IP地址:www.baidu.com/36.152.44.95
    获取域名的方法:www.baidu.com
    获取ip的方法36.152.44.95

端口:

1.计算机程序的进程。

范围:0-65535

类型分类:TCP/UDP:所以实际能够有的进程:需要最大范围*2

端口分类

​ **公用端口:**0-1023

​ 1.HTTP:80

​ 2.HTTPS:433

​ 3.FTP:21

​ 4:Telent:23

程序注册端口

​ 1:Tomcat:8080

​ 2.MySQL:3306

​ 3.Oracle:1521

动态,私有

bash:控制台用到的命令
1.netstat -ano:查看所以端口

InetSocketAddress类:

该类实现IP套接字地址(IP地址+端口号)它也可以是一对(主机名+端口号),在这种情况下将尝试解析主机名。 如果解决方案失败,那么该地址被认为是未解决的,但在某些情况下仍可以使用,例如通过代理连接。
它提供了用于绑定,连接或返回值的套接字所使用的不可变对象。
通配符是一个特殊的本地IP地址。 通常意味着“任何”,只能用于bind操作。

新知:

1.获取端口号:getPort()

import java.net.InetSocketAddress;

public class N02 {
    public static void main(String[] args) {
        InetSocketAddress socketAddress=new InetSocketAddress("127.0.0.1",8080);//在本机上构造了一个端口
        System.out.println(socketAddress.getPort());//获取端口号
        System.out.println(socketAddress.getHostName());//获取主机名字
    }
}

TCP实现聊天

过程:

1.服务端创建地址,端口,地址就是电脑本身的地址,端口自填。

2.客户端通过服务端的地址和端口号进行连接

3.服务端一直检测是否有连接请求并连接

4.通过Socket的对象调用字节输出流,输入想传输的信息。

5.通过Socket对象调用字节输入流,接收字节后存储进字节数组,并将字节数组存储进管道流,并通过管道流输出

6.关闭一切需要关闭的

新知:

1.用来连接服务端的类

Socket socket=new Socket(inetAddress,5555);

2.创建端号

ServerSocket serverSocket=new ServerSocket(5555);

3.监控客户端的连接

serverSocket.accept();

客户端:

package com.zoufeiming.NetworkProgramming;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

//客户端
public class N03 {
    public static void main(String[] args) throws IOException {
       //知道服务器的地址并连接
        InetAddress inetAddress=InetAddress.getByName("192.168.1.101");
        //创建socket连接:地址和端口号
        Socket socket=new Socket(inetAddress,5555);
        //发送消息:用字节输出流
        OutputStream os=socket.getOutputStream();
        os.write("时代".getBytes());//将字符串转换为字符数组并输入IO流中
        os.close();
        socket.close();
    }
}

服务端:

package com.zoufeiming.NetworkProgramming;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

//服务端
public class N04 {
    public static void main(String[] args) throws IOException {

        //创建一个地址和端口号
        ServerSocket serverSocket=new ServerSocket(5555);
        //等待客户端连接
        Socket socket = serverSocket.accept();
        //读取客户端的信息
        InputStream io=socket.getInputStream();
        //先利用字节输入流接收来自客户端的字节,然后通过read方法将字节存储到字节数组中,之后将字节输入到管道流中
        // 然后通过管道流调用tostring全部输出
        byte[] bytes=new byte[1024];
        int len;//利用read方法从输入流中读取数据,读取完会返回-1,否则返回的是字节有效数
        ByteArrayOutputStream bo=new ByteArrayOutputStream();
        while ((len=io.read(bytes))!=-1) {
            bo.write(bytes,0,len);//从指定的数组输入0-len个有效字节
        }
        System.out.println(bo.toString());//输出全部管道流中的字节
        bo.close();
        io.close();
        socket.close();
        serverSocket.close();
    }
}

TCP上传文档实现

1.准备文件,创建连接,通过FileInputStream类将文件传入创建好的OutputStream流中然后发给服务端

注:如果出现找不到文件的错误,请看解决方法:

https://blog.csdn.net/qq_43483251/article/details/108312021

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

//上传文件端
public class N05 {
    public static void main(String[] args) throws IOException {
       //准备文件
        FileInputStream fi=new FileInputStream(new File("tx.jpg"));
        //创建连接
        Socket socket=new Socket(InetAddress.getLocalHost(),9999);
        //创建输出文件的输出流
        OutputStream os = socket.getOutputStream();
        //将文件放入输出流中
        int len;//有效字节数
        byte[] bytes=new byte[1024];//存储文件的字节数组
        while ((len=fi.read(bytes))!=-1){
            os.write(bytes,0,len);
        }
        //关闭资源
        os.close();
        socket.close();
        fi.close();
    }
}

1.创建端口,监听连接请求,接收字节,通过FileOutputStream类将文件传入指定文件中

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

//接收文件端
public class N06 {
    public static void main(String[] args) throws IOException {
        //创建接收文件的服务进程
        ServerSocket serverSocket=new ServerSocket(9999);
        //监听是否有连接请求
        Socket socket = serverSocket.accept();//阻塞式监听并接收
        //获取输入流并接收
        InputStream inputStream = socket.getInputStream();
        //创建接收文件的输出流
        FileOutputStream fo=new FileOutputStream("wjwj.png");
        //将文件输入进指定文件中
        int len;
        byte[] bytes=new byte[1024];
        while ((len=inputStream.read(bytes))!=-1){
            fo.write(bytes,0,len);
        }
        //关闭资源
        fo.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
    }
}

UDP实现发送信息

新知:

1.创建一个有端口的进程,

如果是发送方端口号需要自定义,因为在发送数据时需要提供ip和端口号,构造方法可以是端口号,或者端口号+ip地址

DatagramSocket socket=new DatagramSocket(8080);

2.把数据打包并指明发送对象的类

        参数:数据(Byte类型),发送数据的长度,要发给谁
        DatagramPacket packet=new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,inetAddress,port);

3.发送数据的方法

是类DatagramSocket中的方法:

socket.send(packet);//发送包

4.接收发送方的数据

将发送方的数据接收并且通过DatagramPacket的对象和DatagramPacket的构造方法存储进byte类型的数组中

socket.receive(packet);

5.输出发送方的内容

"发送的内容:"+new String(packet.getData(),0,packet.getData().length)

6.发送方的端口号+ip地址

ip地址+端口号:"+packet.getSocketAddress()

发送方:

import java.net.*;

//发送方
public class J01 {
    public static void main(String[] args) throws Exception {
        //建立一个Socket
        DatagramSocket socket=new DatagramSocket(8080);
        //建个包
        String msg="你好!";
        //获取本机地址
        InetAddress inetAddress=InetAddress.getByName("localhost");
        int port=9090;

        //参数:数据(Byte类型),发送数据的长度,要发给谁
        DatagramPacket packet=new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,inetAddress,port);

        socket.send(packet);//发送包

        //关闭流
        socket.close();
    }
}

接收方

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class F01 {
    public static void main(String[] args) throws IOException {
        //在本机地址上建立端口,以接收
        DatagramSocket socket=new DatagramSocket(9090);

        //接收数据包
        byte[] buffer=new byte[1024];
        //构造一个 DatagramPacket用于接收长度的数据包 length 。
        DatagramPacket packet=new DatagramPacket(buffer,0,buffer.length);
        //接收来自DatagramPacket的数据包
        socket.receive(packet);
        //获得包裹中的数据
        System.out.println("发送的内容:"+new String(packet.getData(),0,packet.getData().length));
        System.out.println("返回发送方连接到的端口号:" +packet.getPort());
        System.out.println("发送方ip地址:"+packet.getAddress().getHostAddress());
        System.out.println("字节长度:"+packet.getLength());
        System.out.println("ip地址+端口号:"+packet.getSocketAddress());
        //关闭流

        socket.close();
    }
}

UDP实现多线程双方实时聊天

UDP实现单向持续聊天

1.System.in

是一个很原始、很简陋的输入流对象,通常不直接使用它来读取用户的输入。
一般会在外面封装过滤流:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
然后调用br.readLine()方法进行读取。

需要进行包装的原因

System.in返回值类型是字节输入流类型(InputStream)

InputStreamReader类构造方法中可以接收InputStream的参数

BufferedReader类的构造方法接收Reader类型的参数且其readLine()方法可以读一行的文字

URL下载网络资源

1.HttpURLConnection

只是一个抽象类,只能通过 url.openConection() 方法创建具体的实例。严格来说,openConection() 方法返回的是 URLConnection 的子类。根据 url 对象的不同,如可能不是 http:// 开头的,那么 openConection() 返回的可能就不是 HttpURLConnection。

package com.zoufeiming.NetworkProgramming.url;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class MyUrl {
    public static void main(String[] args) throws IOException {
        //1.下载地址
        URL url = new URL("https://m10.music.126.net/20200831181708/c20383383ed8da09328a98430968be2c/ymusic/obj/w5zDlMODwrDDiGjCn8Ky/3253345932/a82c/c8f1/c240/74c34f5ed76bbb99c3022948717e56e4.mp3");
        //连接到这个资源
        HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
        InputStream inputStream = urlConnection.getInputStream();
        FileOutputStream fo=new FileOutputStream("天外来物.mp3");
        byte[] buffer=new byte[1024];
        int len;
        while ((len=inputStream.read(buffer))!=-1){
            fo.write(buffer,0,len);
        }
        fo.close();
        inputStream.close();
        urlConnection.disconnect();//断开连接
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值