赤赤赤赤辰

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

Java网络编程笔记参考

网络编程

每日一考

  • 一个IP对应哪个类的一个对象?

    • InetAddress
  • 实例化这个类的方法是?

    • InetAddress.getByName(String host); //填域名或者地址
    • InetAddress.getLocalHost();//获取本地IP
  • 传输层的TCP协议和UDP协议的主要区别?

    • TCP:可靠的数据传输(三次握手):进行大量数据传输。效率低
    • UDP:不可靠:以数据包的形式发送和,数据包限定为64k。效率高
  • URL是什么?你能写一个URL吗?

    • URL:统一资源定位符
    • URL url = new URL("http://192.168.14.100:8080/example/hello.txt?username=Tom");
  • 谈谈你对对象序列化机制的理解?

    • 实现接口:Serializable标识接口(接口中没有方法)
    • 对象所在的类提供常量:序列版本号。static final long serialVersionUID = -6052424284110960213L
    • 要求对象的属性也必须是可序列化的。(基本数据类型、String本身就已经是可序列化的)

复习

网络通信要素

/**
 * 一、网络编程中两个主要的问题
 * 1. 如何准确地定位网络上一台或多台主机,定位主机上的特定应用
 * 2、找到主机后如何实现可靠高效的数据传输
 *
 * 二、网络编程中的两个要素
 * 1. 对应问题一:IP和端口号
 * 2. 对应问题二:提供网络通信协议:TCP/IP参考模型(应用层,传输层,网络层,物理+数据链路层)
 *
 * 三、通信要素一:IP
 * 1. IP:唯一的标识 Internet 上的计算机(通信实体)
 * 2. InetAddress类:主要表示IP地址,两个子类:Inet4Address、Inet6Address。
 * 3. IP地址分类方式1:IPV4 和 IPV6
 * 4. 域名:www.baidu.com
 域名解析:域名容易记忆,当在连接网络时输入一个主机的域名后,域名服务器(DNS)
负责将域名转化成IP地址,这样才能和主机建立连接。 
 * 5. 本机回路地址:127.0.0.1 对应着localhost
 * 6. 如何让实例化InetAddress:两个方法:getByName(String host),getLocalHost();
 *          两个常用方法:getHostName() getHostAddress()
 * 7. 端口号:正在计算机上运行的程序
 * 要求:不同进程有不同端口号
 * 范围:被规定为一个16位的整数 0~65535
 * 8. 端口号于PI地址的组合得出一个网络套接字:Socket
 */

TCP UDP URL

TCP

package com.shc.java1;

import org.junit.Test;

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

/**
 * 实现TCP的网络编程
 *1.客户端发送内容给服务端,服务端将内容打印到控制台上。
 * @author shc
 * @create 2021-06-09 0:34
 */
public class TCPTest {
    //客户端:
    @Test
    public void client()  {
        Socket socket = null;
        OutputStream os = null;
        try {
            //1. 创建Socket对象,指明服务器的IP(InetAddress类对象)和端口号
            InetAddress inet = InetAddress.getByName("127.0.0.1");
            socket = new Socket(inet,8899);
            //2. 获取一个输出流 用于输出数据
            os = socket.getOutputStream();
            //3. 输出流写出数据
            os.write("你好我是你爸".getBytes());
        } catch (IOException 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();
                }
            }
        }
    }

    @Test
    public void server() {
        ServerSocket ss = null;
        Socket socket = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        try {
            //1. 创建服务器端的ServerSocket,指明自己的端口号
            ss = new ServerSocket(8899);
            //2. 调用accept()表示接收来自于客户端的socket
            socket = ss.accept();
            //3. 获取输入流
            is = socket.getInputStream();//数据已经在输入流中,接下来要做的是把输入流中的数据读入内存(buffer)中

            //4. 读取输入流中的数据
            byte[] buffer = new byte[5];
            int len = 0;
            baos = new ByteArrayOutputStream();
            while((len = is.read(buffer))!=-1){
                baos.write(buffer,0,len); //把buffer中的【0,len)字节写入baos类中的字节数组 如果直接把读到buffer中的字节输出的话可能乱码。因为我们用的是字节流不是字符流
            }
            String ans = baos.toString();
            String src = socket.getInetAddress().getHostAddress();
            System.out.println(src+":"+ans);
        } 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(ss!=null){
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}
package com.shc.java1;

import org.junit.Test;

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

/**
 * 2.客户端发送文件给服务端,服务端将文件保存在本地。
 * @author shc
 * @create 2021-06-09 14:45
 */
public class TCPTest2 {
    /*
    涉及到的异常应当使用try-catch-finally来处理
     */
    //用户端
    @Test
    public void client() throws IOException {
        //1.获取Socket(通过目标主机IP及端口号)
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
        //2.获取输出流 吧内存中的东西写入网络
        OutputStream os = socket.getOutputStream();
        //3.获取输入流 把文件读入内存:fis.read(buffer) ,后续再用别的输出流输出给网络
        FileInputStream fis = new FileInputStream(new File("test.jpg"));
        //4.具体读入操作
        byte[] buffer = new byte[1024];
        int len = 0; //fis.read(buffer) 把fis对应的文件的内容写入buffer
        while((len=fis.read(buffer))!=-1){
            os.write(buffer,0,len); //通过os把buffer中的内容写出给socket
        }
        //这里没用shutdownOutput还可以正常结束程序是因为这里os结束后直接关闭socket(不用再等待server端执行动作),os端直接结束循环,
        //资源关闭
        fis.close();
        os.close();
        socket.close();
    }
    
    //服务器端
    @Test
    public void server() throws IOException {
        //1. 造一个ServerSocket(由于服务器端是接收端,所有IP一定是本机的IP,所以没有必要指定)(指指定端口号即可)
        ServerSocket ss = new ServerSocket(9090);
        //2. 获取客户端的Socket
        Socket socket = ss.accept();//Listens for a connection to be made to this socket and accepts it. The method blocks until a connection is made.A new Socket s is created and,
        //3. 获取客户端的输入流(把输入流中的内容读入到文件)
        InputStream is = socket.getInputStream();
        //4. 由于要保存到本地,所有建立一个输出流(从内存输出到文件)
        OutputStream os = new FileOutputStream(new File("test2.jpg"));
        //5. 读取过程
        byte[] buffer = new byte[1024];
        int len = 0;
        while((len = is.read(buffer))!=-1){
            os.write(buffer,0,len);
        }
        //6. 关闭资源,从底部向上面关
        os.close();
        is.close();
        socket.close();
        ss.close();
    }
}
package com.shc.java1;

import org.junit.Test;

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

/**
 * .从客户端发送文件给服务端,服务端保存到本地。并返回“发送成功”给客户端。并关闭相应的连接。
 * @author shc
 * @create 2021-06-09 15:19
 */
public class TCPTest3 {
    /*
    涉及到的异常应当使用try-catch-finally来处理
     */
    //用户端
    @Test
    public void client() throws IOException {
        //1.获取Socket(通过目标主机IP及端口号)
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
        //2.获取输出流 吧内存中的东西写入网络
        OutputStream os = socket.getOutputStream();
        //3.获取输入流 把文件读入内存:fis.read(buffer) ,后续再用别的输出流输出给网络
        FileInputStream fis = new FileInputStream(new File("test.jpg"));
        //4.具体读入操作
        byte[] buffer = new byte[1024];
        int len = 0; //fis.read(buffer) 把fis对应的文件的内容写入buffer
        while((len=fis.read(buffer))!=-1){
            os.write(buffer,0,len); //通过os把buffer中的内容写出给socket
        }
        socket.shutdownOutput();//明确告诉服务器端输出完了
//        System.out.println("发送成功1");
        //5.接收返回信息
        InputStream is = socket.getInputStream(); //输入流:里面有服务器返回的内容
        ByteArrayOutputStream baos = new ByteArrayOutputStream();//输出流:将is流读入内存中的内容写出到baos内部的字节数组
        byte[] bufferr = new byte[20];//读入内存
        while((len=is.read(bufferr))!=-1){
            baos.write(bufferr,0,len);//写出到baos中
        }
//        System.out.println("接收成功2");
        String ans = baos.toString();
        System.out.println(ans);
        //6.资源关闭
        is.close();
        baos.close();
        fis.close();
        os.close();
        socket.close();
    }

    //服务器端
    @Test
    public void server() throws IOException {
        //1. 造一个ServerSocket(由于服务器端是接收端,所有IP一定是本机的IP,所以没有必要指定)(指指定端口号即可)
        ServerSocket ss = new ServerSocket(9090);
        //2. 获取客户端的Socket
        Socket socket = ss.accept();//Listens for a connection to be made to this socket and accepts it. The method blocks until a connection is made.A new Socket s is created and,
        //3. 获取客户端的输入流(把输入流中的内容读入到文件)
        InputStream is = socket.getInputStream();
        //4. 由于要保存到本地,所有建立一个输出流(从内存输出到文件)
        OutputStream os = new FileOutputStream(new File("test4.jpg"));
        //5. 读取过程
        byte[] buffer = new byte[1024];
        int len = 0;
        while((len = is.read(buffer))!=-1){ //客户端的输来的流在读到末尾时不会返回-1 只有在读文件读到末尾时才会返回-1.
            // 所以客户端输出结束后必须明确shutdownOutput(); 程序才能正常向下走
            os.write(buffer,0,len);
        }
//        System.out.println("接收成功1");
        OutputStream oos = socket.getOutputStream();
//        System.out.println("接收成功11");
        oos.write("你好猪啊猪,已经收到你的照片".getBytes());

        //6. 关闭资源,从底部向上面关
        oos.close();
        os.close();
        is.close();
        socket.close();
        ss.close();
    }
}

URL

 * URL 网络编程
 * 1. URL:统一资源定位符
 * 2. 格式:
 * http://localhost:8080/examples/beauty.jpg?username=Tom&password=123
 * 协议:主机名    端口号 资源地址           参数列表
 * 3. 如何实例化?
     URL url = new URL("http://localhost:8080/examples/beauty.jpg?username=Tom&password=123");
 * 4. 常用方法
         /*
    public String getProtocol( ) 获取该URL的协议名
    public String getHost( ) 获取该URL的主机名
    public String getPort( ) 获取该URL的端口号
    public String getPath( ) 获取该URL的文件路径
    public String getFile( ) 获取该URL的文件名
    public String getQuery( ) 获取该URL的查询名
     */

 * 5. 可以读取、下载对应的url资源
     代码。。。。
posted on 2021-08-21 09:56  咕噜辰  阅读(42)  评论(0)    收藏  举报