二十七 Java的语言基础(网络编程)

1.网络编程的目的:

无线电台…传播交流信息,数据交换,通信.

2.网络通信的要素:

规则:网络通信的协议;
TCP/IP参考模型:
在这里插入图片描述

3.IP

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

//测试IP
public class TestInetAddress {
    public static void main(String[] args) {
        try {
        //查询本机地址
        InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
        System.out.println(inetAddress1);
        InetAddress inetAddress3 = InetAddress.getByName("localhost");
        System.out.println(inetAddress3);
        InetAddress inetAddress4 = InetAddress.getLocalHost();
        System.out.println(inetAddress4);

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

        //常用方法
        // System.out.println(inetAddress2.getAddress());
        System.out.println(inetAddress2.getCanonicalHostName()); //规范的名字
        System.out.println(inetAddress2.getHostAddress()); //ip
        System.out.println(inetAddress2.getHostName()); //域名,或者自己电脑的名字
    } catch (UnknownHostException e) {
        e.printStackTrace();
        }
    }
}

4.端口

import java.net.InetSocketAddress;

public class TestInetSocketAddress {
public static void main(String[] args) {

    InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8080);
    InetSocketAddress socketAddress2 = new InetSocketAddress("localhost", 8080);
    System.out.println(socketAddress);
    System.out.println(socketAddress2);

    System.out.println(socketAddress.getAddress());
    System.out.println(socketAddress.getHostName()); //地址
    System.out.println(socketAddress.getPort()); //端口
	}
}

5、通信协议

协议: 约定,就好比我们现在说的是普通话。
网络通信协议: 速率,传输码率,代码结构,传输控制……
*TCP/IP协议簇:实际上是一组协议;
重要:

  • TCP : 用户传输协议
  • UDP : 用户数据报协议
    出名的协议:
  • TCP:
  • IP : 网络互连协议
    TCP udp 对比

TCP : 打电话

  • 连接,稳定

  • 三次握手 四次挥手

    最少需要三次,保证稳定连接!
    A:你瞅啥?  
    B: 瞅你咋地?
    A:干一场!
    
    A:我要走了!
    B:我真的要走了吗?
    B:你真的真的要走了吗?
    A:我的真的要走了!
    
  • 客户端、服务端

  • 传输完成,释放连接,效率低

UDP : 发短信

  • 不连接,不稳定
  • 客户端、服务端:没有明确的界限
  • 不管有没有准备好,都可以发给你…
  • 导弹
  • DDOS : 洪水攻击! (饱和攻击)

6.TCP

传输消息:客户端

  1. 连接服务器 Socket

  2. 发送消息

     import java.io.IOException;
     import java.io.OutputStream;
     import java.net.InetAddress;
     import java.net.Socket;
     import java.net.UnknownHostException;
    
     //客户端
     public class TcpClientDemo01 {
         public static void main(String[] args) {
     
             Socket socket = null;
         OutputStream os = null;
    
         try {
         //1. 要知道服务器的地址,端口号
         InetAddress serverIP = InetAddress.getByName("127.0.0.1");
         int port = 9999;
         //2. 创建一个socket连接
         socket = new Socket(serverIP,port);
         //3. 发送消息 IO流
         os = socket.getOutputStream();
         os.write("你好,欢迎学习狂神说Java".getBytes());
         
     } catch (Exception e) {
         e.printStackTrace();
     } finally {
         if (os!=null){
             try {
                 os.close();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
    
         if (socket!=null){
             try {
                 socket.close();
             } catch (IOException e) {
                 e.printStackTrace();
                     }
                 }
             }
         }
     }
    

服务器:
1. 建立服务的端口 ServerSocket
2. 等待用户的链接 accept
3. 接收用的消息

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

//服务端
public class TcpServerDemo01 {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;

        try {
            //1. 我得有一个地址
            serverSocket = new ServerSocket(9999);
            while (true){
                //2. 等待客户端连接过来
                socket = serverSocket.accept();
                //3. 读取客户端的消息
                is = socket.getInputStream();

                //管道流
                baos = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int len;
                while ((len=is.read(buffer))!=-1){
                    baos.write(buffer,0,len);
            }
            System.out.println(baos.toString());
        }

        /*
            byte[] buffer = new byte[1024];
            int len;
            while ((len=is.read(buffer))!=-1){
                String msg = new String(buffer, 0, len);
                System.out.println(msg);
            }
         */

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        //关闭资源
        if (baos!=null){
            try {
                baos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (is!=null){
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (socket!=null){
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        if (serverSocket!=null){
            try {
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
                }
            }
        }
    }
}

文件上传

服务器端

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

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

        //4. 文件输出
        FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));
        byte[] buffer = new byte[1024];
        int len;
        while ((len=is.read(buffer))!=-1){
            fos.write(buffer,0,len);
        }
        //通知客户端我接收完毕了
        OutputStream os = socket.getOutputStream();
        os.write("我接受完毕了,你可以断开了".getBytes());
        
        //关闭资源
        fos.close();
        is.close();
        socket.close();
        serverSocket.close();
	    }
	}

客户端

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClientDemo02 {
    public static void main(String[] args) throws Exception {
        //1.创建一个Socket连接
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
    //2、 创建一个输出流
    OutputStream os = socket.getOutputStream();

    //3. 读取文件
    FileInputStream fis = new FileInputStream(new File("qinjiang.jpg"));
    //4. 写出文件
    byte[] buffer = new byte[1024];
    int len;
    while ((len=fis.read(buffer))!=-1){
        os.write(buffer,0,len);
    }

    //通知服务器,我已经结束了
    socket.shutdownOutput(); //我已经传输完了!

    //确定服务器接收完毕,才能够断开连接
    InputStream inputStream = socket.getInputStream();
    //String byte[]
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    byte[] buffer2 = new byte[2014];
    int len2;
    while ((len2=inputStream.read(buffer2))!=-1){
        baos.write(buffer2,0,len2);
    }

    System.out.println(baos.toString());

    //5.关闭资源
    baos.close();
    inputStream.close();
    fis.close();
    os.close();
    socket.close();
}

}

7.UDP

发短信:不用连接,需要知道对方的地址;

发送消息

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

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

        //2. 建个包
        String msg = "你好啊,服务器!";
        InetAddress localhost = InetAddress.getByName("localhost");
        int port = 9090;

        // 数据,数据的长度起始,要发送给谁
        DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);

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

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

接收端

import java.net.DatagramPacket;
import java.net.DatagramSocket;

//还是要等待客户端的链接!
public class UdpServerDemo01 {
    public static void main(String[] args) throws Exception {
        //开放端口
        DatagramSocket socket = new DatagramSocket(9090);
        // 接收数据包
        byte[] buffer = new byte[1024];
    DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);

    socket.receive(packet); //阻塞接收

    System.out.println(packet.getAddress().getHostAddress());
    System.out.println(new String(packet.getData(),0,packet.getLength()));
    //关闭连接
    socket.close();
    }
}

咨询

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

public class UdpSenderDemo01 {
    public static void main(String[] args) throws Exception {

        DatagramSocket socket = new DatagramSocket(8888);

    //准备数据: 控制台读取 System.in
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    while (true) {
        String data = reader.readLine();
        byte[] datas = data.getBytes();
        DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666));

        socket.send(packet);
        if (data.equals("bye")){
            break;
        }
    }
    socket.close();
    }
}

import javax.xml.stream.FactoryConfigurationError;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpReceiveDemo01 {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket(6666);

        while (true){


        //准备接收包裹
        byte[] container = new byte[1024];
        DatagramPacket packet = new DatagramPacket(container,0,container.length);
        socket.receive(packet); //阻塞式接收包裹
        
        //断开连接  bye
        byte[] data = packet.getData();
        String receiveData = new String(data, 0, data.length);
        
        System.out.println(receiveData);
        
        if (receiveData.equals("bye")){
            break;
        }

        
    }
    
    socket.close();
    
}

}

8.URL

协议://ip地址:端口/项目名/资源
测试代码:

import java.net.MalformedURLException;
import java.net.URL;
import java.time.Year;

//http://localhost:8080/qinjiang/SecurityFile.txt

public class URLDemo01 {
    public static void main(String[] args) throws MalformedURLException {
        URL url = new URL("http://localhost:8080/helloworld/index.jsp?username=kuangshen&password=123");

    System.out.println(url.getProtocol()); //协议
    System.out.println(url.getHost()); //主机ip
    System.out.println(url.getPort()); //端口
    System.out.println(url.getPath()); //文件
    System.out.println(url.getFile()); //全路径
    System.out.println(url.getQuery()); //参数
    }
}

下载资源

import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;


public class UrlDown {
    public static void main(String[] args) throws Exception {
        //1. 下载地址
        URL url = new URL("https://m10.music.126.net/20191201174818/c09b1932384617e535421702c26ccc5c/yyaac/0708/0652/0508/0b9b6827b718aa223af92bd52aa2424f.m4a");

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

    InputStream inputStream = urlConnection.getInputStream();

    FileOutputStream fos = new FileOutputStream("f.m4a");

    byte[] buffer = new byte[1024];
    int len;
    while ((len=inputStream.read(buffer))!=-1){
        fos.write(buffer,0,len); //写出这个数据
    }

    fos.close();
    inputStream.close();
    urlConnection.disconnect(); //断开连接
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值