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时间内,不断尝试,直至超时;否则判定连接失败

JAVA客户端 netty java客户端和服务端_Java

JAVA客户端 netty java客户端和服务端_Java_02

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();
		}
		
	}
}

注意要先启动服务端

JAVA客户端 netty java客户端和服务端_客户端_03

JAVA客户端 netty java客户端和服务端_网络编程_04

5、网络通信协议

网络通信时采用的传输协议:

TCP:

数据的传输的可靠性高

按顺序: 客户端先发A,再发B,最后发C,服务器接收数据时一定是先收到A,再收到B,最后收到C

保证传输到对应端点;对数据要求高可靠时

主要运用在单播:点对点的数据传输

Java实现:

Socket

ServerScoket

由TCP拓展的协议:HTTP/HTTPS

UDP:

数据传输的可靠性较差

传输数据包时,不保证数据包的先后顺序

丢包严重:不保证每个数据包都能到达目标端

主要运用在组播:

电子教室

直播软件