Java网络编程实战讲解

1.计算机网络

  • 计算机网络是指:将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

在这里插入图片描述

在这里插入图片描述

2.IP地址(InetAddress)

  • 唯一定义一台网络上计算机

  • 127.0.0.1:为本机的IP,也叫 locahost
    在这里插入图片描述

  • IP地址的分类:

    • IP地址分类(IPV4和IPV6)

      • IPV4:127.0.0.1 , 由四个字节组成 ,一个字节的长度为0-255,大概有42亿个;
      • IPV6:fe80::7181:de2b:3f55:ae68%15,128位 ,8个无符号整数!
        在这里插入图片描述
    • 公网(互联网)和私网(局域网)

      • 192.168.xx.xx , 专门给组织机构用的
      • ABCD类IP地址
        在这里插入图片描述
      • 域名:记忆IP问题
  • InetAddress类(此类表示Internet协议的IP地址)
    没有 构造方法, 不能new

package Base;

//测试IP


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

public class bbb {
    public static void main(String[] args) {
        try {
            //查询本机地址
            try {
                InetAddress i2 = InetAddress.getByName("127.0.0.1");
                System.out.println(i2);  ///127.0.0.1
                InetAddress i3 = InetAddress.getByName("localhost");
                System.out.println(i3);
                InetAddress i4 = InetAddress.getLocalHost();
                System.out.println(i4);
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }


            //查询网站IP地址
            InetAddress i1 = InetAddress.getByName("www.baidu.com");
            System.out.println(i1);  //www.baidu.com/182.61.200.6

            //
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }

    }

}

3.端口Port

  • 端口表示计算机上的一个程序进程
  • 不同的进程有不同的端口号!
    在这里插入图片描述

在这里插入图片描述

  • InetSocketAddress:此类实现 IP 套接字地址(IP 地址 + 端口号)。它还可以是一个对(主机名 + 端口号),在此情况下,将尝试解析主机名。如果解析失败,则该地址将被视为未解析 地址,但是其在某些情形下仍然可以使用,比如通过代理连接。
package Base;
import java.net.InetSocketAddress;


public class bbb {
    public static void main(String[] args) {
        InetSocketAddress s1 = new InetSocketAddress("localhost",8080);  //localhost/127.0.0.1:8080
        System.out.println(s1);

        System.out.println(s1.getHostName());  //localhost
        System.out.println(s1.getAddress());//ip地址 localhost/127.0.0.1
        System.out.println(s1.getPort());//端口  8080
    }
}

4.通信协议

  • 协议:约定,就好比我们说的普通话
  • TCP :用户传输协议
  • UDP :用户数据报协议
  • IP :网络互连协议
  • TCP(连接打电话)与UDP(不链接发短信)的对比
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

TCP实现文件上传

package Base;


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


//客户端 读取文件
public class Demo2 {
    public static void main(String[] args) throws IOException {
        //1.创建一个Socket连接
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
        //2.创建一个输出流
        OutputStream os = socket.getOutputStream();
        //3.读取文件
        FileInputStream fis = new FileInputStream("D:\\code\\src\\Base\\1_BigPic.png");
        //4.写出文件
        byte[] buffer = new byte[1024];
        int len;
        while((len=fis.read(buffer))!=-1){
            os.write(buffer,0,len);

        }

        //5.关闭资源
        fis.close();
        os.close();
        socket.close();
    }
}
package Base;

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

//服务端 接收文件
public class TCPdemo1 {
    public static void main(String[] args) throws IOException {
        //1.创建服务
        ServerSocket serverSocket = new ServerSocket(9000);
        //2.监听客户端的连接
        Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户端的连接
        //3.获取输入流
        InputStream is = socket.getInputStream();

        //4.文件输出
        FileOutputStream fos = new FileOutputStream("receive.jpg");
        byte[] b = new byte[1024];
        int len;
        while((len = is.read(b))!=-1){
            fos.write(b,0,len);
        }
        //通知服务器 我已经结束了
        socket.shutdownOutput();

        //确定服务器接收完毕  才能断开连接
        InputStream inputStream = socket.getInputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] bufferto = new byte[1024];int lenq;
        while((lenq=fis.read(bufferto))!=-1){
            os.write(bufferto,0,lenq);
        }
        //5.关闭资源
        fos.close();
        is.close();
        socket.close();
        serverSocket.close();
    }
}
  • 步骤
    在这里插入图片描述

Tomcat

  • 重点是使用别人的服务器
    在这里插入图片描述

UDP消息发送

  • UDP(发信息)没有明显的客户端和服务端
  • 发送端
package Base;

import java.net.*;

//UDP 不需要连接服务器
public class Demo3 {
    public static void main(String[] args) throws Exception {
        //1.建立一个Socket(发送)
        DatagramSocket socket = new DatagramSocket();

        //2.建立一个包
        String a ="你好啊,数据宝宝";
            //数据(为字节数组使用getBytes()转换) ,数据的起始位置,要传输给谁
        DatagramPacket datagramPacket = new DatagramPacket(a.getBytes(),0,a.getBytes().length, InetAddress.getByName("localhost"),9090);


        //3.发送包
        socket.send(datagramPacket);

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

    }
}
  • 接收端
package Base;


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

//还是要等待发送端的链接
public class aaa  extends Object{
    //接收端
    public static void main(String[] args) throws IOException {
        //开放端口(接收)
        DatagramSocket socket = new DatagramSocket(9090);

        //接收数据包
        byte[] b= new byte[1024];
        //b为要准备接收的空间    不用管从哪里来的 接就完了
        DatagramPacket Packet = new DatagramPacket(b,0,b.length);

        //使用receive来接收
        socket.receive(Packet);

        //打印一些信息
        System.out.println(Packet.getAddress());
            //注意:Packet为字节数组 需要使用new String()来转换为字符数组
        System.out.println(new String(Packet.getData(),0,Packet.getLength()));
        System.out.println(Packet.getPort());
        System.out.println(Packet.getLength());
        //关闭
        socket.close();


    }
}

UDP实现聊天

  • 因为可以实现互相聊天 ,所以用多线程来实现
  • 线程1
package Base.UDPA;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;


public class Send implements Runnable{
   DatagramSocket socket=null ;
   BufferedReader reader=null;
   private int fromPort;
   private String toIP;
   private int toPort;

   public Send(int fromPort, String toIP, int toPort) {
       this.fromPort = fromPort;
       this.toIP = toIP;
       this.toPort = toPort;
       try {
           socket = new DatagramSocket(fromPort);
           reader = new BufferedReader(new InputStreamReader(System.in));
       } catch (SocketException e) {
           e.printStackTrace();
       }
   }

   @Override
   public void run() {

       //循环输入
       while (true) {
           try {
               //一行一行的读取
               String data = reader.readLine();
               //创建包  可以使用new InetSocketAddress实现发送到哪
               DatagramPacket packet = new DatagramPacket(data.getBytes(), 0, data.getBytes().length, new InetSocketAddress(toIP,toPort));
               //发送
               socket.send(packet);
               //判断退出循环
               if (data.equals("bye")) {
                   break;
               }
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
       //关闭资源
       socket.close();

   }
}
  • 线程2
package Base.UDPA;


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

public class reserve implements Runnable{
    DatagramSocket socket =null;
    private int fromPort;
    private String name;

    public reserve(int fromPort,String name) {
        this.fromPort = fromPort;
        this.name = name;
        try {
            socket = new DatagramSocket(fromPort);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {

        while (true) {
            try {
                byte[] b = new byte[1024];
                DatagramPacket packet = new DatagramPacket(b,0,b.length);
                socket.receive(packet);

                //判断结束
                byte[] data = packet.getData();
                //将其装换为字符串
                String s = new String(data, 0, data.length);
                //打印接收数据
                System.out.println(name+":"+s);

                if (s.equals("bye")){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        socket.close();


    }
}
  • 实现线程1

package Base.UDPA;

public class TalkStudent {
    public static void main(String[] args) {
        new Thread(new Send(7777,"localhost",9999)).start();
        new Thread(new reserve(8888,"老师")).start();

    }
}
  • 实现线程2
package Base.UDPA;

public class Teacher {
    public static void main(String[] args) {
        new Thread(new Send(5555,"localhost",8888)).start();
        new Thread(new reserve(9999,"学生")).start();
    }
}

URL下载网络资源

在这里插入图片描述

在这里插入图片描述

package Base.practice;



import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.*;

public class Url {
    public static void main(String[] args) throws IOException {
        //下载地址
        URL url = new URL("https://img.alicdn.com/tfs/TB1R5fsgyDsXe8jSZR0XXXK6FXa-281-80.jpg");

        //连接到这个资源  使用HTTP连接    url.openConnection()
        HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();

        //得到流
        InputStream is = urlConnection.getInputStream();
        FileOutputStream fos = new FileOutputStream("81-80.jpg");
        byte[] b = new byte[1024];
        int len =0;
        while((len = is.read(b))!=-1){
            fos.write(b,0,len);
        }

        fos.close();
        is.close();
        //断开连接
        urlConnection.disconnect();

    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值