1、C/S: 客户端与服务器端
特点:
1)需要安装特定的客户端
2)服务器程序升级,那么客户端程序同步升级
2、B/S: 浏览器与服务器端
特点:
1) 不需要安装特定的客户端(只需要一个浏览器软件)
2) 服务器程序升级,客户端程序不需要升级。
结论:进入web开发之后,软件结构从C/S 过渡到 B/S
java web开发就是基于B/S结构软件。
3、 网络编程 TCP/IP C/S
打电话 --连接-- 接了 —通话 TCP
发短信 --发送了就完事 --接收 UDP
网络编程从大的方面说就是对信息的发送到接收,中间传输为物理线路的作用。
网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理,代码、开发工具、数据库、服务器架设和网页设计这5部分你都要接触。
1.1网络编程的目的
进行数据交换、实现通讯功能。
1.2网络的通信协议
-
通信双方地址
ip 如本机:127.0.0.1
端口号 -
网络通信的协议
http、tcp/udp…
1.3IP地址
ip地址:InetAddress
唯一定位一台网络上的计算机
1.4端口·
端口表示计算机上的一个程序的进程
- 不同的进程有不同的端口号!用来区分软件
- 被规定0-65535
- 但协议下端口号不能冲突
- 端口分类
4.1 公有端口 0-1023
HTTP:80
HTTPS:443
FTP:21
Telent:23
4.2程序注册端口 1024-49151 分配用户和程序
Tomcat:8080
4.3动态、私有:49152-65535
1.5通信协议
协议:约定,好比我们以普通话交流
TCP:用户传输协议
UDP:用户数据报协议
IP:网络互连协议
TCP、UDP比较
TCP:就像打电话一样,有呼叫方和接听方
连接、稳定
三次握手、四次挥手:可以把“三次握手”看成谈对象,“四次挥手”看作是分手时的场景
如A与B进行聊天
最少需要三次,才能保证稳定连接
A:“你瞅啥?”
B;“瞅你咋的”
A:“干”
如A与B聊天中断
最少需要四次才能断开
A:“我要走了?”
B:“你真的要走?”
A:“我确定要走!”
B:“走吧!”
客户端、服务器
传输完成,释放连接,效率低
UDP:就就像发短信一样,发完就没了,不管收没收到
不连接、不稳定
客户端、服务器:没有明确的界限
不管是否准备好,都可以发给你
TCP协议
- 客户端
要先知道服务器的地址与端口号
创建一个Socket连接
发送信息
public class TcpCilent {
public static void main(String[] args) {
InetAddress address=null;
Socket socket=null;
OutputStream os=null;
// 要先知道服务器的地址与端口号
try {
address = InetAddress.getByName("127.0.0.1");
int port=9000;
// 创建一个Socket连接
socket = new Socket(address,port);
// 发送信息
os = socket.getOutputStream();
os.write("获取成功".getBytes());
} catch (Exception e) {
e.printStackTrace();
}finally {
//关闭资源
try {
if(os!=null){
os.close();
}
if(socket!=null){
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 服务端
需要有一个地址
等待客户端连接过来
读取客户端的消息
public class TcpService {
public static void main(String[] args) {
ServerSocket serverSocket=null;
Socket socket=null;
InputStream is=null;
ByteArrayOutputStream bos=null;
// 需要有一个地址
try {
serverSocket = new ServerSocket(9000);
// 等待客户端连接过来
socket= serverSocket.accept();
// 读取客户端的消息
is = socket.getInputStream();
bos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
int len;
while((len=is.read(b))!=-1){
bos.write(b,0,len);
}
System.out.println(bos.toString());
} catch (Exception e) {
e.printStackTrace();
}finally {
//关闭资源
try {
if(bos!=null){
bos.close();
}
if(is!=null){
is.close();
}
if(socket!=null){
socket.close();
}
if(serverSocket!=null){
serverSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
UDP
不需要连接,要知道ip地址
//不需要连接服务器
public class UdpClient {
public static void main(String[] args) {
DatagramSocket socket=null;
DatagramPacket packet=null;
try {
//1、建立一个socket
socket = new DatagramSocket();
InetAddress address = InetAddress.getByName("127.0.0.1");
int port=8999;
String str="hello UDP";
//2、建个包
// DatagramPacket(byte buf[], int offset, int length,InetAddress address, int port)
packet = new DatagramPacket(str.getBytes(),
0,str.getBytes().length,address,port);
//3、发送信息
socket.send(packet);
} catch (Exception e) {
e.printStackTrace();
}finally {
socket.close();
}
}
}
//需等待客户端的连接
public class UdpService {
public static void main(String[] args) {
try {
//获取端口
DatagramSocket socket = new DatagramSocket(8999);
//获收数据包
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
socket.receive(packet);
//输出
System.out.println(new String(packet.getData(),0,packet.getLength()));
//关闭连接
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}