第四章 网络编程
参考哔哩哔哩UP主:“遇见狂神说”做的笔记
4.1 什么是计算机网络?
计算机网络:计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备(比如:小爱机器人),通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
4.2 网络编程的目的
传播交流信息
数据交换
通信
4.3 想要达到效果需要什么?
如何准确定位网络上的一台主机,IP地址和端口
找到了数据,如何传输数据。(如何实现网络通信?)
需要IP 类和端口 udp tcp的类
利用规则:网络通信的协议
4.4 IP、端口号、通信协议
IP地址
IP地址用于唯一标识网络中的一个通信实体,该通信实体既可以是一台主机,也可以是一台打印机或一部智能手机等。基于IP地址协议中网络传输的数据,都必须使用IP地址进行标识。
如果我们要写一封信,需要标明收件人的通信地址和发信人的地址。类似的过程发生在计算机网络中,每一个被传输的数据也包括一个源IP和一个目的IP地址。当该数据包在网络运输中进行传输时,这两个地址要保持不变。以确保网络设备总是能根据确定的IP地址,将数据从源数据通信实体发送到指定的目标通信实体。
IP地址是一个32位的整数,但为了方便记忆,通常将其分为4个8位的二进制数据,每位之间用圆点隔开,每个八位数可以转换成0~255的十进制整数,因此我们所看到的IP地址通常为
“202.103.24.68”
的形式。
公网(互联网)
ABCD类地址
192.168.xx.xx专门给组织内部使用
私网(局域网)
域名:(大概也许,网址就是域名。肤浅理解。)
买域名,和买车牌号一个道理。
com 国际顶级域名
cn 中国国家的域名
端口号
一个通信实体可以有多个通信程序同时提供网络服务,此时还需要端口。端口是一个16的整数用于表示数据交给哪个计算机中的通信程序,微信QQ或者LOL,同一个计算机不能有两个程序使用同一个端口。端口号为0~65535
不同的进程有不同的端口号!用来区分软件。
被规定0~65535
TCP,UDP…单个协议下,单个端口号不能冲突
端口分类
公有端口:0~1023
HTTP:80
HTTPS:443
FTP:21
Telent : 23
程序注册端口:1024~49151,分配用户或者程序
常用的端口
MySQL:3306
Oracle:1521
Tomcat:8080
端口表示计算机上的一个程序进程
通信协议
Javaweb开发指的是网页编程 B/S建构
网络编程主要针对TCP/IP C/S建构
协议:就像约定 就好比我们说的是普通话我们才能好好地进行交流。
TCP/IP协议:实际上一组协议
TCP:用户传输协议 打电话
连接上更稳定
三次握手 四次挥手
A:你瞅啥? B:瞅你咋地? C:干一场! #最少需要三次才能保证正常连接 A:我要走了 B:你真的要走了吗? B:你确定你要走吗? A:我真的要走了。客户端、服务端 Client 和Server C/S
UDP:用户数据报协议 短信
不连接 不稳定
客户端、服务端(没有明确的界限)
不管有没有准备好
4.5 TCP协议实现聊天
管道流
package com.kuang.lesson02;
import com.sun.xml.internal.ws.fault.ServerSOAPFaultException;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
//客户端,先有客户端IP,再有服务端,客户端发送请求
public class Client01 {
public static void main(String[] args) {
Socket socket=null;
OutputStream os=null;
try {
// 服务器IP
InetAddress serverIp = InetAddress.getByName("127.0.0.1");
// 连接端口号
int port = 9999;
// 创建一个Socekt连接
socket = new Socket(serverIp,port);
//发送消息用到IO流
os = socket.getOutputStream();
os.write("你好啊,初学者".getBytes());
} catch (Exception e) {
e.printStackTrace();
}finally {
if (socket!=null){
try {
socket.close();
}catch (IOException e){
e.printStackTrace();
}
}
if (os!=null){
try {
os.close();
}catch (IOException e1){
e1.printStackTrace();
}
}
}
}
}
package com.kuang.lesson02;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
//服务端
public class Server01 {
public static void main(String[] args) throws IOException {
/* 1.要知道服务器的地址
2.要有端口
3.ServerSocket连接
4.发送消息的I/O流 使用的是字节流输出
*/
ServerSocket serverSocket =null;
Socket socket=null;
InputStream is=null;
ByteArrayOutputStream baos=null;
try {
// 端口号
serverSocket = new ServerSocket(9999);
socket =serverSocket.accept();
//读取客户端信息
is =socket.getInputStream();
// 管道流
baos = new ByteArrayOutputStream() ;
byte[]buffer = new byte[1024];
int len;
while ((len=is.read(buffer))!=-1){
baos.write(buffer,0,len);
}
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
}finally {
// 关闭资源
// baos.close();
// is.close();
// socket.close();
// serverSocket.close();
if (baos!=null){
try {
baos.close();
}catch (IOException e){
e.printStackTrace();
}
}
if (is!=null){
try {
is.close();
}catch (IOException e1){
e1.printStackTrace();
}
}
if (socket!=null){
try {
socket.close();
}catch (IOException e2){
e2.printStackTrace();
}
}
if (serverSocket!=null){
try {
serverSocket.close();
}catch (IOException e3){
e3.printStackTrace();
}
}
}
}
}