zoukankan      html  css  js  c++  java
  • 20145204《Java程序设计》第10周学习总结

    网络编程

    网络编程:在两个或两个以上的设备(例如计算机)之间传输数据。程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴。在发送和接收数据时,大部分的程序设计语言都设计了专门的API实现这些功能,程序员只需要调用即可。

    网络通讯方式

    在现有的网络中,网络通讯的方式主要有两种:

    1. TCP(传输控制协议)方式
    2. UDP(用户数据报协议)方式.

    TCP方式就类似于拨打电话,使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据。而UDP方式就类似于发送短信,使用这种方式进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得。

    这两种传输方式都是实际的网络编程中进行使用,重要的数据一般使用TCP方式进行数据传输,而大量的非核心数据则都通过UDP方式进行传递,在一些程序中甚至结合使用这两种方式进行数据的传递。

    网络编程步骤

    • 客户端网络编程:
    1. 建立网络连接
      客户端网络编程的第一步都是建立网络连接。在建立网络连接时需要指定连接到的服务器的IP地址和端口号,建立完成以后,会形成一条虚拟的连接,后续的操作就可以通过该连接实现数据交换了。
    2. 交换数据
      连接建立以后,就可以通过这个连接交换数据了。交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反馈一个响应数据给客户端,如果客户端不发送请求则服务器端就不响应。
      根据逻辑需要,可以多次交换数据,但是还是必须遵循请求响应模型。
    3. 关闭网络连接
      在数据交换完成以后,关闭网络连接,释放程序占用的端口、内存等系统资源,结束网络编程。
    • 服务器端网络编程
    1. 监听端口
      服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口即可。
      这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的IP地址就是服务器端程序的IP地址。
    2. 获得连接
      当客户端连接到服务器端时,服务器端就可以获得一个连接,这个连接包含客户端的信息,例如客户端IP地址等等,服务器端和客户端也通过该连接进行数据交换。
      一般在服务器端编程中,当获得连接时,需要开启专门的线程处理该连接,每个连接都由独立的线程实现。
    3. 交换数据
      服务器端通过获得的连接进行数据交换。服务器端的数据交换步骤是首先接收客户端发送过来的数据,然后进行逻辑处理,再把处理以后的结果数据发送给客户端。简单来说,就是先接收再发送,这个和客户端的数据交换数序不同。

    TCP编程

    在Java语言中,对于TCP方式的网络编程提供了良好的支持,在实际实现时,以java.net.Socket类代表客户端连接,以java.net.ServerSocket类代表服务器端连接。在进行网络编程时,底层网络通讯的细节已经实现了比较高的封装,所以在程序员实际编程时,只需要指定IP地址和端口号码就可以建立连接了。

    • 在客户端网络编程中,首先需要建立连接,在Java API中以java.net.Socket类的对象代表网络连接,所以建立客户端网络连接,也就是创建Socket类型的对象,该对象代表网络连接,示例如下:
             Socket socket1 = new Socket(“192.168.1.103”,9999);
    
             Socket socket2 = new Socket(“www.sohu.com”,80);
    
    

    连接一旦建立,则完成了客户端编程的第一步,紧接着的步骤就是按照“请求-响应”模型进行网络数据交换,在Java语言中,数据传输功能由Java IO实现,也就是说只需要从连接中获得输入流和输出流即可,然后将需要发送的数据写入连接对象的输出流中,在发送完成以后从输入流中读取数据即可。示例代码如下:

             OutputStream os = socket1.getOutputStream(); //获得输出流
    
             InputStream is = socket1.getInputStream();     //获得输入流
    
    

    最后当数据交换完成以后,关闭网络连接,释放网络连接占用的系统端口和内存等资源,完成网络操作,示例代码如下:

             socket1.close();
    
    
    • 在服务器端程序编程中,由于服务器端实现的是被动等待连接,所以服务器端编程的第一个步骤是监听端口,也就是监听是否有客户端连接到达。实现服务器端监听的代码为:
    
     ServerSocket ss = new ServerSocket(9998);
    
    

    该代码实现的功能是监听当前计算机的9998号端口,如果在执行该代码时,9998号端口已经被别的程序占用,那么将抛出异常。否则将实现监听。

    服务器端编程的第二个步骤是获得连接。该步骤的作用是当有客户端连接到达时,建立一个和客户端连接对应的Socket连 接对象,从而释放客户端连接对于服务器端端口的占用。

    最后,在服务器端通信完成以后,关闭服务器端连接。实现的代码为:

         ss.close();
    
    

    客户端代码:

    
    package hello;
    
    import java.io.*;
    import java.net.*;
    /**
     * 简单的Socket客户端
     * 功能为:发送字符串“Hello”到服务器端,并打印出服务器端的反馈
     */
    public class Client {
             public static void main(String[] args) {
                       Socket socket = null;
                       InputStream is = null;
                       OutputStream os = null;
                       //服务器端IP地址
                       String serverIP = "172.20.10.3";
                       //服务器端端口号
                       int port = 9998;
                       //发送内容
                       String data = "Hello";
                       try {
                                //建立连接
                                socket = new Socket(serverIP,port);
                                //发送数据
                                os = socket.getOutputStream();
                                os.write(data.getBytes());
                                //接收数据
                                is = socket.getInputStream();
                                byte[] b = new byte[1024];
                                int n = is.read(b);
                                //输出反馈数据
                                System.out.println("服务器反馈:" + new String(b,0,n));
                       } catch (Exception e) {
                                e.printStackTrace(); //打印异常信息
                       }finally{
                                try {
                                         //关闭流和连接
                                         is.close();
                                         os.close();
                                         socket.close();
                                } catch (Exception e2) {}
                       }
             }
    }
    
    

    服务器代码:

    package hello;
    import java.io.*;
    import java.net.*;
    /**
    * echo服务器
    * 功能:将客户端发送的内容反馈给客户端
    */
    public class Server {
          public static void main(String[] args) {
                    ServerSocket serverSocket = null;
                    Socket socket = null;
                    OutputStream os = null;
                    InputStream is = null;
                    //监听端口号
                    int port = 9998;
                    try {
                             //建立连接
                             serverSocket = new ServerSocket(port);
                             //获得连接
                             socket = serverSocket.accept();
                             //接收客户端发送内容
                             is = socket.getInputStream();
                             byte[] b = new byte[1024];
                             int n = is.read(b);
                             //输出
                             System.out.println("客户端发送内容为:" + new String(b,0,n));
                             //向客户端发送反馈内容
                             os = socket.getOutputStream();
                             os.write(b, 0, n);
                    } catch (Exception e) {
                             e.printStackTrace();
                    }finally{
                             try{
                                      //关闭流和连接
                                      os.close();
                                      is.close();
                                      socket.close();
                                      serverSocket.close();
                             }catch(Exception e){}
                    }
          }
    }
    
    

    结果:

    本周代码托管截图

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 3500行 30篇 400小时
    第一周 100/100 1/1 20/20
    第二周 200/300 1/2 30/50
    第三周 300/600 1/3 28/78
    第四周 400/1000 1/4 20/98
    第五周 350/1350 1/5 30/128
    第六周 450/1800 2/6 32/ 160
    第七周 350/2150 2/8 20/ 180
    第八周 250/2400 2/10 22/202
    第九周 400/2800 2/12 20/222
    第10周 420/3220 2/14 20/240

    参考资料

  • 相关阅读:
    leetcode
    Vim i和a差别
    HDU-4643-GSM(DFS)
    使用可编程电源自动化输出电源
    如何使用全局变量
    异步和同步
    启动界面
    鼠标右键弹出菜单
    Qt+excel
    Qt+数据库
  • 原文地址:https://www.cnblogs.com/yayaer/p/5471804.html
Copyright © 2011-2022 走看看