JAVA第十周《网络编程》学习内容总结

时间:2022-09-17 11:14:48

JAVA第十周《网络编程》学习内容总结

学习内容总结

1.初听到网络编程四个字可能会觉得很困难,实际上网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据,把数据发送到指定的位置,或者接收到指定的数据.

2.路由器和交换机组成了核心的计算机网络,计算机只是这个网络上的节点以及控制等,通过光纤、网线等连接将设备连接起来,从而形成了一张巨大的计算机网络。

3.网络最主要的优势在于共享.

4.我们通过IP地址找到网络上的计算机,IP地址是指网络中的每个设备都会有一个唯一的数字标识.现在命名IP地址的规定是IPv4协议,该协议规定每个IP地址由4个0-255之间的数字组成,例如10.0.120.34。每个接入网络的计算机都拥有唯一的IP地址.

5.注意!!IP地址无论以何种方式获得或是否是固定的,每个计算机在联网以后都拥有一个唯一的合法IP地址.

6.为了方便记住IP地址,出现了域名,一个IP地址可以对应多个域名,一个域名只能对应一个IP地址

7.在网络中传输的数据,全部是以IP地址作为地址标识,所以在实际传输数据以前需要将域名转换为IP地址,实现这种功能的服务器称之为DNS服务器

8.端口(port)让一个计算机可以同时运行多个网络程序.端口的号码必须位于0-65535之间,每个端口唯一的对应一个网络程序,一个网络程序可以使用多个端口.

9.网络通讯都基于“请求-响应”模型,第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序,简称服务器(一旦通讯建立,客户端和服务器没有本质差别.)

10.网络编程中的两种程序就分别是客户端和服务器端,这种结构被称为客户端/服务器结构,也叫做Client/Server结构,简称C/S结构.

-使用C/S结 构的程序,在开发时需要分别开发客户端和服务器端

-使用浏览器作为客户端的结构被称作浏览器/服务器结构,也叫做Browser/Server结构,简称为B/S结构,

C/S和B/S的优劣:表现力丰富,通用性差,几乎不能通用(C/S)

开发的压力比较小,不需要维护客户端,浏览器的限制比较大,表现力不强,无法进行系统级操作等(B/S)

11.P2P(Point to Point)程序,既包含客户端程序,也包含服务器端程序.

12.在数据交换前需要规定该数据的格式,这个数据的格式就是协议(Protocol).协议的格式随意,按照这种协议格式能够生成唯一的编码,按照该编码可以唯一的解析出发送数据的内容即可.

-协议的设计以及协议的生产和解析,这个才是网络编程中最核心的内容

13.网络通讯的方式主要有两种:

1、 TCP(传输控制协议)方式,相当于打电话

2、 UDP(用户数据报协议)方式,相当于发短信

这两种方式可以单独使用,也可以合在一起使用.由于TCP需要建立专用的虚拟连接以及确认传输是否正确,所以使用TCP方式的速度稍微慢一些,而且传输时产生的数据量要比UDP稍微大一些

14.客户端(Client)是指网络编程中首先发起连接的程序,一般用来实现程序界面和基本逻辑实现.客户端的编程主要由以下三方面决定:

1.建立网络连接(需要指定连接到的服务器的IP地址和端口号)
2.交换数据(严格按照请求响应模型进行)
3.关闭网络连接

服务器端(Server)是指在网络编程中被动等待连接的程序,服务器端的编程步骤和客户端不同,是由四个步骤实现:

1.监听端口

2.获得连接

3.交换数据

4.关闭连接

15.和网络编程有关的基本API位于java.net包中,既包含基础的网络编程类,也包含封装后的专门处理WEB相关的处理类.以下为基础的网络类举例:

-1.InetAddress类。(功能是代表一个IP地址,并且将IP地址和域名相关的操作方法包含在该类的内部)

使用代码如下:

ackage inetaddressdemo;
import java.net.*;
/**
* 演示InetAddress类的基本使用
*/
public class InetAddressDemo {
public static void main(String[] args) {
try{
//使用域名创建对象
InetAddress inet1 = InetAddress.getByName("www.163.com");
System.out.println(inet1);
//使用IP创建对象
InetAddress inet2 = InetAddress.getByName("127.0.0.1");
System.out.println(inet2);
//获得本机地址对象
InetAddress inet3 = InetAddress.getLocalHost();
System.out.println(inet3);
//获得对象中存储的域名
String host = inet3.getHostName();
System.out.println("域名:" + host);
//获得对象中存储的IP
String ip = inet3.getHostAddress();
System.out.println("IP:" + ip);
}catch(Exception e){}
}
}

16.以java.net.Socket类代表客户端连接,以java.net.ServerSocket类代表服务器端连接.实际编程时,只需要指定IP地址和端口号码就可以建立连接了.

-示例如下:

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

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

上面的代码中,socket1实现的是连接到IP地址是192.168.1.103的计算机的10000号端口,而socket2实现的是连接到域名是www.sohu.com的计算机的80号端口

OutputStream os = socket1.getOutputStream(); //获得输出流
InputStream is = socket1.getInputStream();     //获得输入流
ocket1.close(); //关闭网络链接

17.如需在控制台上编译和运行客户端编程代码,则需以下Java命令:

javac –d . SimpleSocketClient.java //编译
java tcp.SimpleSocketClient //执行

18.服务器编程代码:

ServerSocket ss = new ServerSocket(10000); //监听端口
Socket socket = ss.accept(); //获得链接
ss.close(); //关闭服务器链接

19.一次完整的通讯过程是指:客户端程序首先发送数据给服务器端,服务器接收数据以后,将结果反馈给客户端,客户端接收到服务器端的反馈,从而完成一次通讯过程!!

20.accept方法是阻塞方法,所以当客户端连接未到达时,将阻塞该程序的执行

21.UDP方式的编程,包含客户端网络编程和服务器端网络编程,主要由两个类实现,分别是:

DatagramSocket
DatagramPacket

22.客户端程序和服务器端程序需要进行协议处理的代码分别如下。

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

1、 客户端发送协议格式的生成

2、 服务器端反馈数据格式的解析

服务器端程序需要完成的处理为:

1、 服务器端反馈协议格式的生成

2、 客户端发送协议格式的解析

常见协议的格式,例如HTTP(Hyper Text Transfer Protocol,超文本传输协议)、
FTP(File Transfer Protocol,文件传输协议),
SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)等等

23.客户端程序功能列表:

1、 接收用户控制台输入

2、 判断输入内容是否合法

3、 按照协议格式发送数据

4、 根据服务器端的反馈给出相应提示

         服务器端程序功能列表:

1、 接收客户端发送数据

2、 按照协议格式解析数据

3、 判断发送过来的数字和随机数字的关系

4、 根据判断结果生产协议数据

5、 将生产的数据反馈给客户端

客户端程序协议格式如下:
1、 将用户输入的数字转换为字符串,然后转换为byte数组
2、 发送“quit”字符串代表退出
其中服务器端程序协议格式如下:
1、 反馈长度为1个字节,数字0代表相等(猜中),1代表大了,2代表小了,其它数字代表错误。

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

简单的客户端编程代码,交换数据"Hello"

package tcp;
import java.io.*;
import java.net.*;
/**
* 简单的Socket客户端
* * 功能为:发送字符串“Hello”到服务器端,并打印出服务器端的反馈
*/
public class SimpleSocketClient {
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 = "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) {}
}
}
}

TCP服务器端编程:

package tcp;
import java.io.*;
import java.net.*;
/**
* echo服务器
* 功能:将客户端发送的内容反馈给客户端
*/
public class SimpleSocketServer {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
OutputStream os = null;
InputStream is = null;
//监听端口号
int port = 10000;
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){}
}
}
}

代码调试中的问题和解决过程

用到的包之前在学习时大多没有遇到过,所以比较陌生,不知道每个包代表什么含义,后来通过查资料,了解了每个包的作用,才逐渐清晰.

本周代码托管截图

其他(感悟、思考等,可选)

此次学习内容和这学期的计算机网络内容较为接近,只是多了实际的JAVA语言操作部分,但通过这些基础知识的学习,再看抽象的Java代码就更能理解了.

学习进度条

代码行数(新增/累积) 博客量(新增/累积 学习时间(新增/累积) 重要成长
目标 5000行 20篇 200小时
第一周 100/100 1/1 7/7
第二周 200/300 1/2 7/14
第三周 400/700 1/3 9/23
第四周 400/1100 1/4 7/30
第五周 500/1600 1/5 9/39
第六周 400/2000 2/7 15/54
第七周 700/2700 2/9 17/71
第八周 500/3200 2/11 12/83
第九周 350/3550 2/13 10/93
第十周 700/4250 2/15 06/99

参考资料