1、服务端和客户端
服务端:主要用提供各种资源,各种功能,各种数据这类的远程服务
客户端:连接服务端从而从服务器下载各种资源,使用各种功能的这种运行在本机上的程序,我们称为客户端
2、网络应用模型(C/S 和 B/S架构)
C/S架构:Client-Server
Client:特有的独立的客户端软件, 通常由服务端开发公司所提供
优点:丰富的用户体验
缺点:客户端部署和升级难度大
B/S架构:浏览器-Server
客户端统一由浏览器充当
优点:客户端部署和升级很容易
缺点:用户体验相对较差
3、Java实现C/S架构的网络程序(着重学习Server端)
1、Java中实现C/S架构的网络程序
Client:
Swing
JavaFx
Server:
Socket编程
Netty
2、Socket编程:
客户端表示:java.net.Socket类(套接字)
服务端表示:java.net.ServerSocket类
ServerSocket:
ServerSocket(int port):创建一个连接服务,立刻去绑定指定的port端口,若绑定成功,就在OS上建立好了这个连接服务
注意: 指定的端口必须是空闲端口
ServerSocket();在内存中创建一个连接服务对象
当我们需要对服务进行一些配置设定时使用,当我们配置完后调用bind方法进行端口绑定,bind( SocketAddress sa ):
如:serverSocket.bind( new InetSocketAddress(8686) ); 正式在OS上建立连接服务
accpet()方法:等待一个客户端连接, 它是一个阻塞方法
Socket:
Socket(String host, int port):创建一个连接对象,立刻去连接指定的host主机,通过port这个端口去连接
Socket():内存中创建一个连接对象,并没有去连接任何主机
调用connect方法去正式连接一个主机connect(SocketAddress endpoint, int timeout):
去连接指定的主机,在没有超过timeout时间内,不断尝试,直至超时;否则判定连接失败
4、网络数据的收发
网络数据的收发:
步骤1: 从Socket连接中获取IO流
步骤2: 利用IO流的API完成数据的传递
注意: BIO(OIO)这些流中的read相关方法都是阻塞方法,\当没有读到数据时,当前线程会一直阻塞,直到读到数据后才恢复
package net;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class NetDataServer {
public static void main(String[] args) {
try {
//创建服务端,绑定8686端口,让客户端连接
ServerSocket ss = new ServerSocket(8686);
//等待客户端连接
Socket conn = ss.accept();
System.out.println("欢迎"+conn.getInetAddress().getHostAddress()+"访问");
//----接收客户端发送的数据
//获得连接的输入流
InputStream is = conn.getInputStream();
//字节输入流转换成字符输入流
BufferedReader in = new BufferedReader(
new InputStreamReader(is)
);
//读取客户端的发送的信息
//只要客户端通过writer流写出数据,服务端就能通过reader流读取到数据
//read方法都是阻塞方法
String msg = in.readLine();
System.out.println(msg);
//----发送数据给客户端
//获得连接的输出流
OutputStream os = conn.getOutputStream();
PrintWriter out = new PrintWriter(os);
out.println("服务端向客户端发送消息:你好,客户端");
//强制提交发送的数据
out.flush();
Thread.sleep(60*60*1000);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
package net;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
public class NetDataClient {
public static void main(String[] args) {
try {
//创建客户端连接服务,去连接服务端
Socket socket = new Socket("localhost",8686);
System.out.println("连接成功");
//---向服务端写数据(发送消息)
OutputStream os = socket.getOutputStream();
PrintWriter out = new PrintWriter(os);
out.println("客户端向服务端发送消息:你好,服务端");
out.flush();
//---接收服务端消息
InputStream is = socket.getInputStream();
BufferedReader in = new BufferedReader(
new InputStreamReader(is)
);
String msg = in.readLine();
System.out.println(msg);
Thread.sleep(60*60*1000);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
注意要先启动服务端
5、网络通信协议
网络通信时采用的传输协议:
TCP:
数据的传输的可靠性高
按顺序: 客户端先发A,再发B,最后发C,服务器接收数据时一定是先收到A,再收到B,最后收到C
保证传输到对应端点;对数据要求高可靠时
主要运用在单播:点对点的数据传输
Java实现:
Socket
ServerScoket
由TCP拓展的协议:HTTP/HTTPS
UDP:
数据传输的可靠性较差
传输数据包时,不保证数据包的先后顺序
丢包严重:不保证每个数据包都能到达目标端
主要运用在组播:
电子教室
直播软件