网络编程(十九)

网络编程(十九)

网络编程基本概念

IP地址:计算机的网络接口(通常是网卡)在网络中的唯一标识;有IPv4和IPv6两种类型

网关:负责连接多个网络,并在多个网络之间转发数据的计算机,通常是路由器或交换机

网络协议:互联网使用TCP/IP协议,它泛指互联网协议簇

TCP协议:一种面向连接,可靠传输的协议;

UDP协议:一种无连接,不可靠传输的协议。

*3次握手,4次挥手

*网络模型:OSI七层模型和TCP/IP四层模型,OSI是理想中的模型,TCP/IP是实际广泛使用的模型

image-20210224191935154

TCP编程

发送字符流内容

在TCP编程中,主要使用的有Socket类,服务端使用ServerSocket,客户端使用Socket;下面是一个客户端发送内容,服务端接收的例子:

服务端

package com.netcode;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class ServeDemo {
    public static void main(String[] args) {
        try {
            //开启服务端服务,指定端口
            ServerSocket serverSocket = new ServerSocket(9999);
            //accept()等待客户端的连接,这会阻塞后面代码的执行
            Socket socket = serverSocket.accept();
            //使用BufferReader获取客户端发送的数据
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//            String s = bufferedReader.readLine();
//            System.out.println(s);
            String s;
            while ((s=bufferedReader.readLine()) != null) {
                //将收集到的客户端发送的数据打印
                System.out.println(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端

package com.netcode;

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

public class ClientDemo2 {
    public static void main(String[] args) {
        try {
            //指定IP和端口连接远程的服务器
            Socket socket = new Socket("127.0.0.1", 9999);
            //创建输出流,用来向服务端发送数据
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            //创建输入流,从System.in键盘输入获取要发送的内容
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            String s;
            //这里使用while循环输入,循环发送消息
            while ((s=bufferedReader.readLine())!=null) {
                //向服务端发送数据
                bufferedWriter.write(s);
                bufferedWriter.write("\n");
                bufferedWriter.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

发送字节流内容

除了可以发送字符内容,也可以发送图片等内容,区别就是使用字节流的方式来发送,下面的例子中,客户端发送一张图片到服务端,服务端接收到内容后,将图片保存到本地:

服务端

package com.netcode;

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

public class ReceiveFileDemo {
    public static void main(String[] args) {
        try {
            //启动Socket服务
            ServerSocket socket = new ServerSocket(9999);
            //创建输入流,将远程发送的字节流写入到服务器端的文件
            FileOutputStream outputStream = new FileOutputStream("src/com/netcode/wh3.png");
            //开启socket监听
            Socket accept = socket.accept();
            //保存远程发送的字节流
            InputStream inputStream = accept.getInputStream();

            byte[] bytes = new byte[1024];
            int len;
            while ((len=inputStream.read(bytes))!=-1) {
                //读取字节流中的信息写入
                outputStream.write(bytes, 0, bytes.length);
            }

            outputStream.close();
            inputStream.close();
            socket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端

package com.netcode;

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

public class SendFileDemo {
    public static void main(String[] args) {
        try {
            //连接远程服务器
            Socket socket = new Socket("127.0.0.1", 9999);
            //创建本地文件的输入流,用来读取本地文件
            FileInputStream inputStream = new FileInputStream("src/com/netcode/wh1.png");
            //创建输出流,用来向远程服务器发送内容
            OutputStream outputStream = socket.getOutputStream();

            byte[] bytes = new byte[1024];
            int len;
            while ((len=inputStream.read(bytes))!=-1) {
                //从本地的输入流中读取内容,发送到远程服务器
                outputStream.write(bytes, 0, bytes.length);
            }

            socket.close();
            outputStream.close();
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
/*
IO流中图片的读取和写入:
    FileInputStream inputStream = new FileInputStream("src/com/netcode/wh1.png");
    FileOutputStream outputStream = new FileOutputStream("src/com/netcode/wh2.png");
    byte[] bytes = new byte[1024];
    int len;
    while ((len=inputStream.read(bytes))!=-1) { //每当byte[1024]存储满了读取一次
        outputStream.write(bytes, 0, bytes.length);
    }
    outputStream.close();
    inputStream.close();
 */

UDP编程

在UDP编程中使用的是DatagrameSocket类和DatagramePackage类,Socket类用来创建通信,Package类用来携带数据。

服务端

package com.netcode;


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

public class UdpDemo1 {
    public static void main(String[] args) throws IOException {
        try {
            //创建一个UDP连接
            DatagramSocket socket = new DatagramSocket(6666);
            //创建一个字节数组用来接收数据
            byte[] bytes = new byte[1024];
            //创建Package用来装载机接收到的数据
            DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
            //接收客户端发来的数据
            socket.receive(packet);
            //获取发送数据来的IP地址
            String ip = packet.getAddress().getHostAddress();
            //获取端口
            int port = packet.getPort();
            //获取长度
            int length = packet.getLength();
            //输出获取到的内容
            System.out.println(new String(bytes, 0 , length)+"..."+ip+":"+port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }
}

客户端

package com.netcode;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;

public class UdpDemo2 {
    public static void main(String[] args) throws IOException {
        byte[] data = "Hello,World!".getBytes();
        //获取要通信机器的IP地址
        InetAddress inet = InetAddress.getByName("127.0.0.1");
        //创建Package携带要发送的数据
        DatagramPacket packet = new DatagramPacket(data, data.length, inet, 6666);
        //创建UDP通信
        DatagramSocket socket = new DatagramSocket();
        //往指定的机器发送数据
        socket.send(packet);

        socket.close();
    }
}

Java中网络编程的内容实用频率不多,用法也相对固定,理解逻辑上的顺序,忘记了多来看看加深记忆;最终要是巩固IO流的知识更加重要

posted @ 2021-02-24 19:44  LucaZ  阅读(53)  评论(0编辑  收藏  举报