转载请标明原文地址,后续会持续更新《从零开始学习》系列,数据结构和算法,Mysql和ssm框架。
如果有问题可以私信或者直接在文章下评论,大概晚上会回。
如果零基础的同学没有学习的大概方向也可以私信问我,发给你一些学习路线和一些B站的学习视频地址。
希望能为世界带来些微价值,peace!
网络编程
一、什么是网络
由点和线构成,表示诸多对象间的相互联系。
二、计算机网络
- 为实现资源共享和信息传递,通过通信线路连接起来的若干主机(Host)。
互联网:(Internet)点与点相连 - 万维网:(WWW – World Wide Web)端与端相连
- 物联网:( IoT - Internet of things) 物与物相连
- 网络编程:让计算机与计算机之间建立连接、进行通信。
三、网络模型
OSI(Open System Interconnection)开放式系统互联。
TCP/IP模型:
一组用于实现网络互连的通信协议,将协议分成四个层次。
四、通信协议
TCP/UDP
- TCP协议:Transmission Control Protocol 传输控制协议
- 是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据大小无限制。建立连 接的过程需要三次握手,断开连接的过程需要四次挥手。
- UDP协议:User Datagram Protocol 用户数据报协议//游戏中的高pin战士就是UDP协议。
- 是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,每个包的大小 64KB。
五、IP与端口
IP
- IP协议:Internet Protocol Address 互联网协议地址/网际协议地址
- 分配给互联网设备的数字标签(唯一标识)。
- IP地址分为两种:
- IPV4:4字节32位整数,并分成4段8位的二进制数,每8位之间用圆点隔开,每8位 整数可以转换为一个0~255的十进制整数。 格式:D.D.D.D 例如:255.255.255.255
- IPV6:16字节128位整数,并分成8段十六进制数,每16位之间用圆点隔开,每16位整数可以转换为一个0~65535的十进制数。
- 格式:X.X.X.X.X.X.X.X 例如:FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF
IPV4的应用分类
- A类:政府机构,1.0.0.1 ~ 126.255.255.254
- B类:中型企业,128.0.0.1 ~ 191.255.255.254
- C类:个人用户,192.0.0.1 ~ 223.255.255.254
- D类:用于组播,224.0.0.1 ~ 239.255.255.254
- E类:用于实验,240.0.0.1 ~ 255.255.255.254
- 回环地址:127.0.0.1,指本机,一般用于测试使用。
- 查看IP命令:ipconfig
- 测试IP命令:ping D.D.D.D
Port
-
端口号:
在通信实体上进行网络通讯的程序的唯一标识。
-
端口分类:
- 公认端口:0~1023
- 注册端口:1024~49151
- 动态或私有端口:49152~65535
-
常用端口:
- MySql:3306
- Oracle:1521
- Tomcat:8080
- SMTP:25
- Web服务器:80
- FTP服务器:21
六、网络编程
InetAddress类
- 概念:表示互联网协议(IP)地址对象,封装了与该IP地址相关的所有信息, 并提供获取信息的常用方法。
- 方法:
- public static InetAddress getLocalHost() 获得本地主机地址对象
- public static InetAddress getByName(String host) 根据主机名称获得地址对象
- public static InetAddress[] getAllByName(String host) 获得所有相关地址对象
- public String getHostAddress() 获取IP地址字符串
- public String getHostName() 获得IP地址主机名
public class TestInetAddress {
public static void main(String[] args) throws UnknownHostException {
//获得本机IP地址对象
InetAddress localhost = InetAddress.getLocalHost();
//获得IP地址字符串
//System.out.println(localhost.getHostAddress());
//获得IP地址对应主机名称
//System.out.println(localhost.getHostName());
//获得任意主机的IP地址对象(IP、主机名、域名)
InetAddress baidu = InetAddress.getByName("www.baidu.com");
//System.out.println(baidu.getHostAddress());
//System.out.println(baidu.getHostName());
//获得任意域名所绑定的所有IP地址对象
InetAddress[] addrs = InetAddress.getAllByName("www.baidu.com");
for (InetAddress addr : addrs) {
System.out.println(addr.getHostAddress());
System.out.println(addr.getHostName());
}
}
}
//没有构造方法的调用,直接调用类的方法。
public class TestInetAddress {
public static void main(String[] args){
MyClass myClass = MyClass.getMyClassInstance();
}
}
class MyClass{
private MyClass(){//1.没有构造方法
}
public static MyClass getMyClassInstance(){//2.通过.方法调用//规范得到对象的思路
return new MyClass();
}
}
基于TCP的网络编程
- Socket编程:
- Socket(套接字)是网络中的一个通信节点。
- 分为客户端Socket与服务器ServerSocket。
- 通信要求:IP地址 + 端口号。
开发步骤
- 建立通信连接(会话):
- 创建ServerSocket,指定端口号
- 调用accept等待客户端接入
- 客户端请求服务器:
- 创建Socket,指定服务器IP + 端口号
- 使用输出流,发送请求数据给服务器
- 使用输入流,接收响应数据到客户端(等待)
- 服务器响应客户端:
- 使用输入流,接收请求数据到服务器(等待)
- 使用输出流,发送响应数据给客户端
public class MyServer {
public static void main(String[] args) throws IOException {
//定义服务器
ServerSocket serverSocket = new ServerSocket(7777);
//接入客户端
Socket accept = serverSocket.accept();
//读数据(接受请求)
InputStreamReader inputStreamReader = new InputStreamReader(accept.getInputStream(), "UTF-8");
BufferedReader request = new BufferedReader(inputStreamReader);
//数据处理
String s = request.readLine();
s = s.toUpperCase();
//写数据(返回响应)
PrintWriter response = new PrintWriter(new OutputStreamWriter(accept.getOutputStream(),"UTF-8"));
response.println(s);
response.flush();
//关闭该客户端请求
accept.close();
}
}
public class MyClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",7777);
//写数据(发送请求)
OutputStream outputStream = socket.getOutputStream();
PrintWriter request = new PrintWriter(new OutputStreamWriter(outputStream, "UTF-8"));
request.println("HelloWorld");
request.flush();
//读数据(接收响应)
BufferedReader response = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
String s = response.readLine();
//处理
System.out.println(s);
socket.close();
}
}
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
//接入客户端
Socket client = serverSocket.accept();
//获得请求对象
BufferedReader request = new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));
//接收客户端请求数据
String userInfo = request.readLine();
//保存用户信息
String result = saveUserInfo(userInfo);
//获得响应对象
PrintWriter reponse = new PrintWriter(new OutputStreamWriter(client.getOutputStream(),"UTF-8"));
reponse.println(result);
reponse.flush();
//将操作结果返回给客户端
}
public static String saveUserInfo(String userInfo) throws IOException {
//创建流,执行一个properties文件
PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream("E:\\Files\\userInfo.properties",true),"UTF-8"));
//解析出id的值作为“=”前得key、直接将userInfo代表的字符串作为”=“后的value
String id = getId(userInfo);
// System.out.println(id);
//保存用户信息到文件中
Properties properties = new Properties();
properties.setProperty(id, userInfo);//key value
properties.store(out, "注释");//把key value以流的形式存到pro文件中
return "RegisterSuccessful" ;
}
public static String getId(String userInfo){
int startIndex = userInfo.indexOf(":") ;
int endIndex = userInfo.indexOf(",");
return userInfo.substring(startIndex,endIndex);//第一个冒号+1,第一个逗号结束
}
}
//完成注册与登录功能
public class Client {
private static final Scanner input = new Scanner(System.in);
public static void main(String[] args) throws IOException {
Socket client = null;
client = new Socket("127.0.0.1",8888);
//采集用户信息
String userInfo = registMenu();
//获得请求对象
PrintWriter request = new PrintWriter(new OutputStreamWriter(client.getOutputStream(),"UTF-8"));
//用流的方式向服务器发送请求数据
// System.out.println(userInfo);
request.println(userInfo);
request.flush();
//获得响应对象
BufferedReader reponse = new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));
//接收服务器的响应结果
String result = reponse.readLine();
//客户端本地打印操作结果
System.out.println(result);
client.close();
}
private static String registMenu() {
System.out.println("请输入学号:");
String id = input.next();
System.out.println("请输入密码:");
String pwd = input.next();
System.out.println("请输入姓名:");
String name = input.next();
System.out.println("请输入性别:");
String sex = input.next();
System.out.println("请输入年龄:");
String age = input.next();
System.out.println("请输入成绩:");
Double score = input.nextDouble();
//返回整理后的字符串(约定-->协议)
return toJSON(id,pwd,name,sex,age,score);
}
/**
* 将零散数据整合成一个
* @return 格式字符串
* @param id
* @param pwd
* @param name
* @param sex
* @param age
* @param score
*/
public static String toJSON(String id, String pwd, String name, String sex, String age, Double score){
String json = "{id : "+id+",pwd :" + pwd +",name :" + name +",sex :" + sex +",age :" + age +",score :" + score + "}";
return json;
}
}
案例:
-
案例1:TCP编程实现客户端发送数据给服务器端
-
案例2:TCP编程实现客户端上传文件给服务器端
-
案例3:TCP实现多个客户端发送数据给服务器端
-
使用Socket编程实现服务器端注册:
- 注册信息保存在properties文件中。
- 封装格式:
- id = {id : ”1001”, name :“tom”, pwd : ”123”, age : 20 , score : 98.5}
- 注册成功后返回字符串“注册成功”。
-
使用Socket编程实现服务器端登录:
- 获取properties文件中的用户信息,进行用户名与密码的校验。
- 校验成功后返回字符串“登录成功”。
总结
- 计算机网络:
- 为实现资源共享和信息传递,通过通信线路连接起来的若干主机。
- TCP协议:
- 是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据大小无限制。
- IP:
- 分配给互联网设备的数字标签(唯一标识)。
- Port:
- 在通信实体上进行网络通讯的程序的唯一标识。
- Socket编程:
- 建立连接、接收请求、发送响应。