软件结构
-
C/S结构 :全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、迅雷等软件。
-
B/S结构 :全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有谷歌、火狐等。
两种架构各有优势,但是无论哪种架构,都离不开网络的支持。网络编程,就是在一定的协议下,实现两台计算机的通信的程序。
网络通信协议
-
网络通信协议:通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信。这就好比在道路中行驶的汽车一定要遵守交通规则一样,协议中对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守,最终完成数据交换。
-
TCP/IP协议: 传输控制协议/因特网互联协议( Transmission Control Protocol/Internet Protocol),是Internet最基本、最广泛的协议。它定义了计算机如何连入因特网,以及数据如何在它们之间传输的标准。它的内部包含一系列的用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求.
通信协议
在介绍TCP/IP结构时,提到传输层的两个重要的高级协议,分别是UDP和TCP,其中UDP是User Datagram Protocol的简称,称为用户数据报协议,TCP是Transmission Control Protocol的简称,称为传输控制协议。
UDP协议
UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。
TCP协议
TCP传输控制协议 (Transmission Control Protocol)。TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。
-
三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。
-
第一次握手,客户端向服务器端发出连接请求,等待服务器确认。
-
第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。
-
第三次握手,客户端再次向服务器端发送确认信息,确认连接。
-
由于TCP协议的面向连接特性,它可以保证传输数据的安全性,所以是一个被广泛采用的协议,例如在下载文件时,如果数据接收不完整,将会导致文件数据丢失而不能被打开,因此,下载文件时必须采用TCP协议.
package demo01;
// 接收端 receive
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class Teat03 {
public static void main(String[] args) throws IOException {
//创建接收端对象
DatagramSocket ds = new DatagramSocket(8888);
//创建接收端数据对象
byte[] bytes = new byte[1024*64];
DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
//调用接收端的receive接收数据
ds.receive(dp);
//拆包
InetAddress ip = dp.getAddress();
int port = dp.getPort();
int length = dp.getLength();
System.out.println(ip +":"+port+" "+new String(bytes,0,length));
// //关闭资源
// ds.close();
}
}
package demo01;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Test01 {
public static void main(String[] args) throws UnknownHostException {
//获取本地主机
InetAddress host = InetAddress.getLocalHost();
System.out.println(host);
String name = host.toString().split("/")[0];
String ip = host.toString().split("/")[1];
System.out.println(name);
System.out.println(ip);
//
// String hostName = host.getHostName();
// String hostAddress = host.getHostAddress();
// System.out.println(hostName);
// System.out.println(hostAddress);
System.out.println("--------------------------------------------");
InetAddress byName = InetAddress.getByName("192.168.5.111");
System.out.println(byName);
System.out.println(byName.getHostName());
InetAddress byName1 = InetAddress.getByName("www.baidu.com");
System.out.println(byName1);
}
}
package demo01;
//UDP 发送端send
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;
public class Test02 {
public static void main(String[] args) throws IOException {
//创建发送端对象
DatagramSocket ds = new DatagramSocket();
//
// byte[] bytes = "Hello,UDP!".getBytes();
byte[] bytes = "今晚吃鱼?".getBytes();
InetAddress ip = InetAddress.getByName("127.0.0.1");
DatagramPacket dp = new DatagramPacket(bytes,bytes.length,ip,8888);
//
ds.send(dp);
//关闭资源
ds.close();
}
}
package demo02;
//客户端 发送
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class TCPlient {
public static void main(String[] args) throws IOException {
//1.创建客户端对象
Socket s = new Socket("192.168.220.1",9999);
//2.获取字节输出流对象
OutputStream out = s.getOutputStream();
//3.向服务端 发送数据
out.write("周末没厨子,交易取消".getBytes());
System.out.println("--------------------------");
//4.获取字节输入流对象
InputStream in = s.getInputStream();
//5.接收服务端返回的数据
byte[] bytes = new byte[1024];
int len = in.read(bytes);
System.out.println(new String(bytes,0,len));
//关闭资源
in.close();
out.close();
s.close();
}
}
package demo02;
//服务器
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class TCPserver {
public static void main(String[] args) throws IOException {
//1.创建服务端对象 绑定端口
ServerSocket ss = new ServerSocket(9999);
//2.调用accept 方法 获取正在链接的客户端对象
Socket s = ss.accept();
//3.使用客户端
InputStream in = s.getInputStream();
//4.接收客户端发送的数据
byte[] bytes = new byte[1024];
int len = in.read(bytes);
System.out.println(new String(bytes,0,len));
System.out.println("---------===============----------");
//5.使用客户端
OutputStream out = s.getOutputStream();
//6.向当前客户端 返回数据
out.write("继续交易".getBytes());
//关闭资源
out.close();
in.close();
s.close();
}
}
package demo02;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) throws IOException {
//创建发送端对象
DatagramSocket ds = new DatagramSocket();
Scanner sc = new Scanner(System.in);
while (true) {
String line = sc.nextLine();
byte[] bytes = line.getBytes();
// byte[] bytes = "Hello,UDP!".getBytes();
InetAddress ip = InetAddress.getByName("127.0.0.1");
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, ip, 8888);
//
ds.send(dp);
}
}
}
package demo02;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class UploadClient {
public static void main(String[] args) throws IOException {
//1.创建客户端对象 绑定服务器ip和端口
Socket s = new Socket("127.0.0.1",6666);
//2.创建文件字节输入流 绑定数据源
FileInputStream fis = new FileInputStream("D:\\java\\ideaProject\\新建文件夹\\1.txt");
//3.获取字节输出流对象
OutputStream out = s.getOutputStream();
//4.循环读写
byte[] bytes = new byte[1024];
int len = 0 ;
while ((len = fis.read(bytes))!=-1){
out.write(bytes,0,len);
}
//告知服务器已经写完了
s.shutdownOutput();
System.out.println("---------------------接收服务器返回的数据----------------------");
//5.获取字节输入流对象
InputStream in = s.getInputStream();
//6.接收服务器返回的数据 "上传成功"
int length = in.read(bytes);
System.out.println(new String (bytes,0,length));
//7.关闭资源
in.close();
out.close();
fis.close();
s.close();
}
}
网络编程三要素
协议
-
协议:计算机网络通信必须遵守的规则.
IP地址
-
IP地址:指互联网协议地址(Internet Protocol Address),俗称IP。要想使网络中的计算机能够进行通信,必须为每台计算机指定一个标识号,通过这个标识号来指定接受数据的计算机或者发送数据的计算机。
在TCP/IP协议中,这个标识号就是IP地址,它可以唯一标识一台计算机,目前,IP地址广泛使用的版本是IPv4,它是由4个字节大小的二进制数来表示,如:00001010000000000000000000000001。由于二进制形式表示的IP地址非常不便记忆和处理,因此通常会将IP地址写成十进制的形式,每个字节用一个十进制数字(0-255)表示,数字间用符号“.”分开,如 “192.168.1.100”。
随着计算机网络规模的不断扩大,对IP地址的需求也越来越多,IPV4这种用4个字节表示的IP地址面临枯竭,因此IPv6 便应运而生了,IPv6使用16个字节表示IP地址,它所拥有的地址容量约是IPv4的8×1028倍,达到2128个(算上全零的),这样就解决了网络地址资源数量不够的问题。
IP地址分类
-
IPv4:是一个32位的二进制数,通常被分为4个字节,表示成
a.b.c.d
的形式,例如192.168.65.100
。其中a、b、c、d都是0~255之间的十进制整数,那么最多可以表示42亿个。 -
IPv6:由于互联网的蓬勃发展,IP地址的需求量愈来愈大,但是网络地址资源有限,使得IP的分配越发紧张。有资料显示,全球IPv4地址在2011年2月分配完毕。
为了扩大地址空间,拟通过IPv6重新定义地址空间,采用128位地址长度,每16个字节一组,分成8组十六进制数,表示成
ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
,号称可以为全世界的每一粒沙子编上一个网址,这样就解决了网络地址资源数量不够的问题。
常用命令
-
查看本机IP地址,在控制台输入:
ipconfig
-
检查网络是否连通,在控制台输入:
ping 空格 IP地址 ping 220.181.57.216 ping www.baidu.com
特殊的IP地址
-
本机IP地址:
127.0.0.1
、localhost
。
论诗五首·其二
【清】赵翼
李杜诗篇万口传,至今已觉不新鲜。
江山代有才人出,各领风骚数百年。