20145238-荆玉茗 《Java程序设计》第10周学习总结

20145238 《Java程序设计》第10周学习总结

网络编程html

·网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据。程序员所做的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴。在发送和接收数据时,大部分的程序设计语言都设计了专门的API实现这些功能,程序员只须要调用便可。
·网络编程就是两个或多个设备之间的数据交换,其实更具体的说,网络编程就是两个或多个程序之间的数据交换,和普通的单机程序相比,网络程序最大的不一样就是须要交换数据的程序运行在不一样的计算机上,这样就形成了数据交换的复杂。虽然经过IP地址和端口能够找到网络上运行的一个程序,可是若是须要进行网络编程,则还须要了解网络通信的过程。java

·网络通信方式: 在现有的网络中,网络通信的方式主要有两种:程序员

一、 TCP(传输控制协议)方式
             二、 UDP(用户数据报协议)方式
             这两种传输方式都是实际的网络编程中进行使用,重要的数据通常使用TCP方式进行数据传输,而大量的非核心数据则都经过UDP方式进行传递,在一些程序中甚至结合使用这两种方式进行数据的传递。

·网络编程步骤:spring

一、 创建网络链接
客户端网络编程的第一步都是创建网络链接。在创建网络链接时须要指定链接到的服务器的IP地址和端口号,创建完成之后,会造成一条虚拟的链接,后续的操做就能够经过该链接实现数据交换了。
二、 交换数据
链接创建之后,就能够经过这个链接交换数据了。交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反馈一个响应数据给客户端,若是客户端不发送请求则服务器端就不响应。
根据逻辑须要,能够屡次交换数据,可是仍是必须遵循请求响应模型。
三、 关闭网络链接
在数据交换完成之后,关闭网络链接,释放程序占用的端口、内存等系统资源,结束网络编程。
      最基本的步骤通常都是这三个步骤,在实际实现时,步骤2会出现重复,在进行代码组织时,因为网络编程是比较耗时的操做,因此通常开启专门的现场进行网络通信。

·服务器端网络编程步骤编程

一、 监听端口
服务器端属于被动等待链接,因此服务器端启动之后,不须要发起链接,而只须要监听本地计算机的某个固定端口便可。
这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的IP地址就是服务器端程序的IP地址。
二、 得到链接
当客户端链接到服务器端时,服务器端就能够得到一个链接,这个链接包含客户端的信息,例如客户端IP地址等等,服务器端和客户端也经过该链接进行数据交换。
通常在服务器端编程中,当得到链接时,须要开启专门的线程处理该链接,每一个链接都由独立的线程实现。
三、 交换数据
服务器端经过得到的链接进行数据交换。服务器端的数据交换步骤是首先接收客户端发送过来的数据,而后进行逻辑处理,再把处理之后的结果数据发送给客户端。简单来讲,就是先接收再发送,这个和客户端的数据交换数序不一样。
其实,服务器端得到的链接和客户端链接是同样的,只是数据交换的步骤不一样。
固然,服务器端的数据交换也是能够屡次进行的。
在数据交换完成之后,关闭和客户端的链接。
四、 关闭链接
当服务器程序关闭时,须要关闭服务器端,经过关闭服务器端使得服务器监听的端口以及占用的内存能够释放出来,实现了链接的关闭。

TCP编程数组

·以java.net.Socket类表明客户端链接,以java.net.ServerSocket类表明服务器端链接。在进行网络编程时,底层网络通信的细节已经实现了比较高的封装,因此在程序员实际编程时,只须要指定IP地址和端口号码就能够创建链接了。
·在客户端网络编程中,首先须要创建链接,在Java API中以java.net.Socket类的对象表明网络链接,因此创建客户端网络链接,也就是建立Socket类型的对象,该对象表明网络链接,示例以下:服务器

Socket socket1 = new Socket(“192.168.1.103”,10000);

Socket socket2 = new Socket(“www.sohu.com”,80);

·若是须要在控制台下面编译和运行该代码,须要首先在控制台下切换到源代码所在的目录,而后依次输入编译和运行命令:网络

javac –d . SimpleSocketClient.java
 java tcp.SimpleSocketClient

UDP通信
·UDP方式的网络编程也在Java语言中得到了良好的支持,因为其在传输数据的过程当中不须要创建专用的链接等特色。
· 在Java API中,实现UDP方式的编程,包含客户端网络编程和服务器端网络编程,主要由两个类实现,分别是:socket

· DatagramSocket
DatagramSocket类实现“网络链接”,包括客户端网络链接和服务器端网络链接。

· DatagramPacket
DatagramPacket类实现对于网络中传输的数据封装,也就是说,该类的对象表明网络中交换的数据。

·UDP方式的网络编程,编程的步骤和TCP方式相似,只是使用的类和方法存在比较大的区别。
·UDP客户端编程涉及的步骤也是4个部分:创建链接、发送数据、接收数据和关闭链接。tcp

·UDP方式的网络编程中创建链接的实现:
只须要创建一个链接对象便可, DatagramSocket ds = new DatagramSocket();
·能够经过制定链接使用的端口号来建立客户端链接。

DatagramSocket ds = new DatagramSocket(5000);

网络协议:
·网络协议是指对于网络中传输的数据格式的规定。对于网络编程初学者来讲,没有必要深刻了解TCP/IP协议簇,因此对于初学者来讲去读大部头的《TCP/IP协议》也不是一件很合适的事情,由于深刻了解TCP/IP协议是网络编程提升阶段,也是深刻网络编程底层时才须要作的事情。

对于通常的网络编程来讲,更多的是关心网络上传输的逻辑数据内容,也就是更多的是应用层上的网络协议,因此后续的内容均以实际应用的数据为基础来介绍网络协议的概念。

· 网络协议设计完成之后,在进行网络编程时,就须要根据设计好的协议格式,在程序中进行对应的编码了,客户端程序和服务器端程序须要进行协议处理的代码分别以下。

客户端程序须要完成的处理为:

一、 客户端发送协议格式的生成
二、 服务器端反馈数据格式的解析

服务器端程序须要完成的处理为:
一、 服务器端反馈协议格式的生成
二、 客户端发送协议格式的解析

教材学习中的问题和解决过程

一、如何复用Socket链接?
示例代码以下:

package tcp;
import java.io.*;
import java.net.*;
/**
 * 复用链接的Socket客户端
 * 功能为:发送字符串“Hello”到服务器端,并打印出服务器端的反馈
 */
public class MulSocketClient {
         public static void main(String[] args) {
                   Socket socket = null;
                   InputStream is = null;
                   OutputStream os = null;
                   //服务器端IP地址
                   String serverIP = "127.0.0.1";
                   //服务器端端口号
                   int port = 10000;
                   //发送内容
                   String data[] ={"First","Second","Third"};
                   try {
                            //创建链接
                            socket = new Socket(serverIP,port);
                            //初始化流
                            os = socket.getOutputStream();
                            is = socket.getInputStream();
                            byte[] b = new byte[1024];
                            for(int i = 0;i < data.length;i++){
                                     //发送数据
                                     os.write(data[i].getBytes());
                                     //接收数据
                                     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) {}
                   }
         }
}
该示例程序和前面的代码相比,将数据交换部分的逻辑写在一个for循环的内容,这样就能够创建一次链接,依次将data数组中的数据按照顺序发送给服务器端了。
                   若是仍是使用前面示例代码中的服务器端程序运行该程序,则该程序的结果是:

                            java.net.SocketException: Software caused connection abort: recv failed

                                     at java.net.SocketInputStream.socketRead0(Native Method)

                                     at java.net.SocketInputStream.read(SocketInputStream.java:129)

                                     at java.net.SocketInputStream.read(SocketInputStream.java:90)

                                     at tcp.MulSocketClient.main(MulSocketClient.java:30)

服务器反馈:First

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第九周 300/2600 2/2 20/120
第十周 300/2900 2/4 18/140

参考资料