• 网络编程及练习


    定义:

            在网络通信协议下,不同计算机上运行的程序进行的数据传输。计算机和计算机之间通过网络进行数据传输

            可以使用在java.net包下的技术开发出常见的网络应用程序

    常见的软件架构:

    C/S: Client/Server 客户端/服务器  在用户本地需要下载并安装客户端程序,在远程有一个服务器端程序

    优点:画面精美,用户体验好

    缺点:需要开发客户端,也需要开发服务端,用户需要下载和更新的时候太麻烦

    B/S:Browser/Server 只需要一个浏览器,用户通过不同的网址,客户访问不同的服务器

    优点:不需要开发客户端,只需要页面+服务端;用户不需要下载,打开浏览器就能使用;

    缺点:如果应用过大,用户体验会受影响

    三要素:IP 端口号 协议

    IP:

            设备在网络中的地址,是唯一的标识

            定义:

               全称:Internet Protocol,是互联网协议地址,也称IP地址,是分配给上网设备的数字标签,通俗理解:上网设备在网络中的地址,是唯一的

            分类:

              IPv4 IPv6     

              IPv4:

             全称:Internet Protocol version 4,互联网通信协议第四版

             采用32位地址长度,分成4组 2^32方个ip

             点分十进制表示法:每8位表示为一个十进制数,中间用.隔开

             IPv6:

            全称:Internet Protocol version 6,互联网通信协议第六版

            采用128位地址长度,分成8组

            冒分十六进制表示法:将上面每一组用16进制表示,可以省略前面的0

            特殊情况:如果计算出的16进制表示形式中间有多个连续的0,可以用::表示

            地址分类形式:

                    公网地址(万维网使用)和私有地址(局域网使用)

                    192.168.开头的就是私有地址,范围为:192.168.0.0 -- 192.168.255.255,专门为组织机构内部使用,以此节省IP

                    特殊IP地址:127.0.0.1,也可以是localhost:是回送地址也称本地回环地址,也称本机IP,永远只会寻找当前所在本机

       

                                                    图来自黑马程序员网课 

    端口号:

            应用程序在设备中唯一的标识

             由两个字节表示的整数,取值范围:0~65535,其中0~1023之间的端口号用于一些知名的网络服务或者应用,自己使用1024以上的端口号就可以了    

             注意:一个端口号只能被一个应用程序使用

    协议:

            数据在网络中传输的规则,常见的协议有UDP,TCP,http,https,ftp

            OSI参考模型:世界互联协议标准,全球通信规范,

            TCP/IP参考模型(TCP/IP协议):事实上的国际标准

            

                                                                    图来自黑马程序员网课 

    TCP协议:传输控制协议(Transmission Control Protocol),它是面向连接通信协议,速度慢,没有大小限制,数据安全

             TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,通信之前要保证连接已经建立,通过Socket产生IO流来进行网络通信   

             

                                            图来自黑马程序员网课 

    客户端代码:

    1. package com.lazyGirl.netdemo.tcpdemo;
    2. import java.io.DataOutputStream;
    3. import java.io.IOException;
    4. import java.io.OutputStream;
    5. import java.net.Socket;
    6. public class Client {
    7. public static void main(String[] args) throws IOException {
    8. //在创建该对象的同时会连接服务端,如果连不上,代码会报错
    9. Socket socket = new Socket("127.0.0.1",10086);
    10. //可以从连接通道中获取输出流
    11. OutputStream os = socket.getOutputStream();
    12. os.write("你好".getBytes());
    13. os.close();
    14. socket.close();
    15. }
    16. }

    服务端代码:

    1. package com.lazyGirl.netdemo.tcpdemo;
    2. import java.io.BufferedReader;
    3. import java.io.IOException;
    4. import java.io.InputStream;
    5. import java.io.InputStreamReader;
    6. import java.net.ServerSocket;
    7. import java.net.Socket;
    8. public class Server {
    9. public static void main(String[] args) throws IOException {
    10. ServerSocket serverSocket = new ServerSocket(10086);
    11. Socket socket = serverSocket.accept();
    12. // InputStream inputStream = socket.getInputStream();
    13. // InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
    14. // BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    15. BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    16. int b;
    17. while ((b = br.read()) != -1) {
    18. System.out.print((char) b);
    19. }
    20. socket.close();
    21. serverSocket.close();
    22. }
    23. }

    输出:

    UDP协议:用户数据报协议(User Datagram Protocol),它是面向无连接通信协议,速度快,有大小限制,一次最多发送64K,数据不安全,易丢失数据

                                       图来自黑马程序员网课 

     UDP的三种通信方式:

            单播:

            组播: 组播地址:224.0.0.0 ~ 239.255.255.255 其中224.0.0.0 ~ 224.0.0.255为预留的组播地址

            接收端1:

            

    1. package com.lazyGirl.netdemo.udpdemo;
    2. import java.io.IOException;
    3. import java.net.DatagramPacket;
    4. import java.net.InetAddress;
    5. import java.net.MulticastSocket;
    6. public class ReceiveMessageDemo {
    7. public static void main(String[] args) throws IOException {
    8. MulticastSocket ms = new MulticastSocket(10086);
    9. InetAddress group = InetAddress.getByName("224.0.0.1");
    10. ms.joinGroup(group);
    11. byte[] buf = new byte[1024];
    12. DatagramPacket dp = new DatagramPacket(buf, buf.length);
    13. ms.receive(dp);
    14. byte[] data = dp.getData();
    15. int len = data.length;
    16. String ip = dp.getAddress().getHostAddress();
    17. String name = dp.getAddress().getHostName();
    18. System.out.println("ip: " + ip + " name: " + name + " len: " + len + " data: " + new String(data));
    19. ms.close();
    20. }
    21. }

    发送端:

            

    1. package com.lazyGirl.netdemo.udpdemo;
    2. import java.io.IOException;
    3. import java.net.DatagramPacket;
    4. import java.net.InetAddress;
    5. import java.net.MulticastSocket;
    6. public class SendMessageDemo {
    7. public static void main(String[] args) throws IOException {
    8. MulticastSocket ms = new MulticastSocket();
    9. String s = "hello";
    10. byte[] buf = s.getBytes();
    11. InetAddress addr = InetAddress.getByName("224.0.0.1");
    12. int port = 10086;
    13. DatagramPacket dp = new DatagramPacket(buf, buf.length, addr, port);
    14. ms.send(dp);
    15. ms.close();
    16. }
    17. }

         输出: 

            两个接收端都接收到了消息

             

                                                    图来自黑马程序员网课 

            广播:255.255.255.255

            将上面的地址改成255.255.255.255即实现该局域网内所有主机都收到消息

    常见的CMD命令:

            ipconfig: 查看本机ip地址

            ping: 检查网络是否连通

    InetAddress:

            接收端:

    1. package com.lazyGirl.netdemo;
    2. import java.io.IOException;
    3. import java.net.DatagramPacket;
    4. import java.net.DatagramSocket;
    5. import java.net.InetAddress;
    6. import java.net.SocketException;
    7. public class ReceiveMessageDemo {
    8. public static void main(String[] args) throws IOException {
    9. //必须指定端口,且跟发送端口一致
    10. DatagramSocket socket = new DatagramSocket(10086);
    11. byte[] buf = new byte[1024];
    12. DatagramPacket packet = new DatagramPacket(buf, buf.length);
    13. socket.receive(packet);
    14. byte[] data = packet.getData();
    15. int len = packet.getLength();
    16. InetAddress address = packet.getAddress();
    17. int port = packet.getPort();
    18. System.out.println("data " + new String(data,0,data.length));
    19. System.out.println("address " + address.getHostAddress());
    20. }
    21. }

            receive函数会阻塞

            发送端: 

            

    1. package com.lazyGirl.netdemo;
    2. import java.io.IOException;
    3. import java.net.*;
    4. public class SendMessageDemo {
    5. public static void main(String[] args) throws IOException {
    6. DatagramSocket socket = new DatagramSocket();
    7. String str = "hello";
    8. byte[] buf = str.getBytes();
    9. InetAddress address = InetAddress.getByName("192.168.1.111");
    10. int port = 10086;
    11. DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
    12. socket.send(packet);
    13. socket.close();
    14. }
    15. }

    输出:

    聊天室:

    发送端:

    1. package com.lazyGirl.netdemo.netcase1;
    2. import java.io.IOException;
    3. import java.net.*;
    4. import java.util.Scanner;
    5. public class SendMessageDemo {
    6. public static void main(String[] args) throws IOException {
    7. DatagramSocket socket = new DatagramSocket();
    8. Scanner scanner = new Scanner(System.in);
    9. while (true) {
    10. System.out.println("Enter your message");
    11. String message = scanner.nextLine();
    12. if ("886".equals(message)) {
    13. break;
    14. }
    15. byte[] data = message.getBytes();
    16. InetAddress address = InetAddress.getByName("lazyGril");
    17. int port = 10086;
    18. DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
    19. // System.out.println("Sending Message");
    20. socket.send(packet);
    21. }
    22. socket.close();
    23. }
    24. }

    接收端:

    1. package com.lazyGirl.netdemo.netcase1;
    2. import java.io.IOException;
    3. import java.net.DatagramPacket;
    4. import java.net.DatagramSocket;
    5. import java.net.SocketException;
    6. public class ReceiveMessageDemo {
    7. public static void main(String[] args) throws IOException {
    8. DatagramSocket socket = new DatagramSocket(10086);
    9. byte[] buf = new byte[1024];
    10. DatagramPacket packet = new DatagramPacket(buf, buf.length);
    11. while (true) {
    12. socket.receive(packet);
    13. byte[] data = packet.getData();
    14. int len = packet.getLength();
    15. int port = packet.getPort();
    16. String ip = packet.getAddress().getHostAddress();
    17. String name = packet.getAddress().getHostName();
    18. System.out.println("ip: " + ip + " name: " + name + " port: " + port + " len: " + len + " data: " + new String(data));
    19. }
    20. }
    21. }

    输出: 

     

    练习: 

     case1: 

            客户端:发送一条数据,接收服务端反馈的消息并打印

            服务器:接收数据并打印,再给客户端反馈消息

            线程池版:

            客户端:

            

    1. package com.lazyGirl.netdemo.test3;
    2. import java.io.*;
    3. import java.net.Socket;
    4. public class Client {
    5. public static void main(String[] args) throws IOException {
    6. Socket socket = new Socket("127.0.0.1",10086);
    7. BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));
    8. BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
    9. byte[] buf = new byte[1024];
    10. int len;
    11. while ((len = bis.read(buf)) != -1) {
    12. bos.write(buf, 0, len);
    13. }
    14. socket.shutdownOutput();
    15. BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    16. String str = br.readLine();
    17. System.out.println(str);
    18. socket.close();
    19. }
    20. }

    服务端:

    1. package com.lazyGirl.netdemo.test3;
    2. import java.io.*;
    3. import java.net.ServerSocket;
    4. import java.net.Socket;
    5. import java.util.UUID;
    6. import java.util.concurrent.*;
    7. public class Server {
    8. public static void main(String[] args) throws IOException {
    9. ThreadPoolExecutor pool = new ThreadPoolExecutor(
    10. 3,
    11. 16,
    12. 60,
    13. TimeUnit.SECONDS,
    14. new ArrayBlockingQueue<>(2),
    15. Executors.defaultThreadFactory(),
    16. new ThreadPoolExecutor.AbortPolicy()
    17. );
    18. ServerSocket serverSocket = new ServerSocket(10086);
    19. while (true) {
    20. Socket socket = serverSocket.accept();
    21. pool.submit(new MyRunnable(socket));
    22. }
    23. }
    24. }
    1. package com.lazyGirl.netdemo.test3;
    2. import java.io.*;
    3. import java.net.Socket;
    4. import java.util.UUID;
    5. public class MyRunnable implements Runnable {
    6. Socket socket;
    7. public MyRunnable(Socket socket) {
    8. this.socket = socket;
    9. }
    10. @Override
    11. public void run() {
    12. try{
    13. BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
    14. String name = UUID.randomUUID().toString().toString().replaceAll("-", "");
    15. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(name + ".txt"));
    16. int len;
    17. byte[] buf = new byte[1024];
    18. while ((len = bis.read(buf)) != -1) {
    19. bos.write(buf, 0, len);
    20. }
    21. BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    22. bw.write("上传成功");
    23. bw.newLine();
    24. bw.flush();
    25. bw.close();
    26. }catch (IOException e){
    27. e.printStackTrace();
    28. }finally {
    29. if(socket != null){
    30. try {
    31. socket.close();
    32. } catch (IOException e) {
    33. throw new RuntimeException(e);
    34. }
    35. }
    36. }
    37. }
    38. }

     输出:

     

     

             

  • 相关阅读:
    人大金仓分析型数据库监控系统状态(一)
    4.nodejs--nodejs简介、AJAX、MVC
    信安软考 第十八章 网络安全测评技术与标准
    10分钟学会pandas库之一(查看和选择)
    watch 和 watchEffect
    大数据(9j)FlinkCDC
    git log 统计自己代码提交量报错 awk No such file or directory
    PL/SQL编程-存储过程
    Android Glide 3.8 常见方法总结 【圆角、下载、回调】
    vscode在资源管理器中进行查询 vscode 查找文件名 ctrl + P
  • 原文地址:https://blog.csdn.net/lazy_girl_666/article/details/139775505