网络编程

网络编程基础信息了解

1. IP地址

IP地址是用来标识网络中的一个通信实体(计算机、服务器等)的地址。

IP协议有IPv4和IPv6。

IPv4协议采用32位地址,8位为一个单位,以点十分制表示,如:192.168.0.1

IPv6协议次采用128位地址,16位为一个单位,每个整数用4个十六进制位表示,如:3ffa:25d4:b48c:125d:45de:4fa4:568b:57dc

注意:

  • 127.0.0.1为本机地址
  • 192.168.0.0~192.168.255.255为私有地址,属于非注册地址,专门为组织机构内部使用

2. 端口

端口是用来区分一台电脑上的不同程序的,用一个16位二进制整数表示,所以范围是0~65535.

3. URL

在因特网上,每一信息资源都有统一且唯一的地址,这个地址就是URL。

URL由四4部分组成:协议、存放资源的主机域名、资源文件名和端口号。

4. TCP协议

TPC协议是面向连接的,传输数据安全、稳定、效率相对较低。

实现TCP通信需要用到InetAddress类、Server Socket类、Shocket类

5. UDP协议

UDP协议是面向无连接的,传输数据不安全,但效率较高。

实现UDP通信需要用到DatagramPacket类、DatagramSocket类

常用类

1. InetAddress类

InetAddress用于封装计算机的IP地址和DNS(域名系统)

没有构造器,通过静态方法getLocalHost()、getByName()、getAllByName()、getAddress()和getHostName()实现。

2. ServerSocket类

服务器可以通过ServerSocket 类以获取一个端口,并且侦听客户端的请求。

[常用方法](Java 网络编程 | 菜鸟教程 (runoob.com))

3. Socket类

Socket(套接字)为客户端和服务器提供通信的连接。

用来实例化一个Socket对象,来获取Socket的输入输出流。

4. DatagramPacket类

DatagramPacket类表示数据报包。用来封装UDP通信的数据。

构造方法:

  1. DatagramPacket(byte[ ] buf, int length):构建数据报包,用来接收长度为length的数据包
  2. DatagramPacket(byte[ ] buf, int length, InetAddress address, int port): 构建数据报包,将长度为length的包发送到address指定主机的指定端口。

常用方法:

  1. getAddress(): 获取发送或接收方计算机的IP地址。
  2. getData(): 获取发送或接收的数据。
  3. setData(byte[ ] buf): 设置发送的数据.

5. DatagramSocket类

DatagramSocket类的对象可以将DatagramPacke的数据包发送到网络上,然后被客户端的DatagramSocket类对象所接收。

构造方法:

  1. DatagramSocket() 用于构造数据报套接字,并将其绑定到本地主机的端口。
  2. DatagramSocket(int port) 用于创建数据报套接字,并将其绑定到本地主机的端口。

常用方法:

  1. send(DatagramPacket p):从此套接字发送数据包。
  2. receive(DatagramPacket p): 从此套接字接收数据包。
  3. close():关闭此数据报套接字。

TCP通信实现聊天

//服务器端
public class TestServer {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        BufferedReader bufferedReader = null;
        try {
            serverSocket = new ServerSocket(8999);
            socket = serverSocket.accept();
            //创建向客户端发送信息的线程,并启动
            new ServerThread(socket).start();
            //main线程负责读取客户端发送来的数据
            bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while (true) {
                String str = bufferedReader.readLine();
                System.out.println("客户端说:" + str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

//创建服务端线程类,用来读取来自客户端的数据
class ServerThread extends Thread {
    Socket socket;
    BufferedWriter bufferedWriter = null;
    BufferedReader bufferedReader = null;

    public ServerThread(Socket socket) {
        this.socket = socket;
        try {
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        try {
            //如果有在将控制台输入数据,把数据读取出来,写入Socket中
            while (true) {
                String str = bufferedReader.readLine();
                bufferedWriter.write(str + "\n");
                bufferedWriter.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (bufferedWriter != null) {
                    bufferedWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

//客户端
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.function.BiFunction;

public class TestClient {
    public static void main(String[] args) {
        Socket socket = null;
        BufferedReader bufferedReader = null;
        try {
            socket = new Socket(InetAddress.getLocalHost(), 8999);
            //创建向服务器发送信息的线程,并启动
            new ClientThread(socket).start();
            bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //main线程负责接收服务器发来的信息
            while (true) {
                System.out.println("服务器说:" + bufferedReader.readLine());
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
//创建客户端线程类,用来读取来自服务器的数据
class ClientThread extends Thread {
    Socket socket;
    BufferedReader bufferedReader;
    BufferedWriter bufferedWriter;

    public ClientThread(Socket socket) {
        this.socket = socket;
        try {
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            bufferedReader = new BufferedReader(new InputStreamReader(System.in));

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

    @Override
    public void run() {
        try {
            while (true) {
                String str = bufferedReader.readLine();
                bufferedWriter.write(str + "\n");
                bufferedWriter.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (bufferedWriter != null) {
                    bufferedWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:

1634137995124

1634138019447

UDP通信实现聊天

//客户端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class Clinent {
    public static void main(String[] args) throws IOException {
        byte[] bytes = "Java小羊".getBytes();
        //需要告诉数据报包要发到哪台计算机的哪个端口,发送的数据以及数据的长度
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, new InetSocketAddress("localhost", 8999));
        //创建数据报套接字:指定发送信息的端口
        DatagramSocket datagramSocket = new DatagramSocket(9001);
        //发送数据报包
        datagramSocket.send(datagramPacket);
        //关闭资源
        datagramSocket.close();
    }
}
//服务器端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Server {
    public static void main(String[] args) throws IOException {
        //创建数据套接字
        DatagramSocket datagramSocket = new DatagramSocket(8999);
        byte[] bytes = new byte[1024];
        //创建数据包,指定要接收的数据的缓冲位置和长度
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
        //接收客户端发送的数据报
        datagramSocket.receive(datagramPacket);//阻塞式方法
//        datagramPacket.getLength();返回实际收到的数据的字节数
        String str = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
        System.out.println(str);
        //关闭资源
        datagramSocket.close();
    }
}

运行结果:

1634138048062

posted @ 2021-10-14 17:07  Java小羊  阅读(293)  评论(0)    收藏  举报