第十二次总结 网络分层,传输
- 网路分层模型是什么?
- 通信协议:有哪些?
- Java中如何使用网络通信编写程序?
- 网络环境监测?
1.网路分层模型是什么?
OSI模型[七层] TCP/IP网络模型[四层]
应用层 [APP] 应用层
表示层 [数据的表示方式]
会话层 [数据连接方式]
传输层 [数据传输方式] 传输层
网络层 [如何找到对方] 网络层
链路层 数据链路层
物理层
2.通信协议:有哪些?
应用层协议:
| HTTP HTTPS | 超文本传输安全协议 | |
| FTP | 文件传输协议 | |
| SMTP | 简单邮件传输协议 | |
| RTP | 实时传输协议 | 多媒体 |
| RTCP | 实时传输控制协议 |
传输层协议:
TCP
UDP
网络层协议:
IP
TCP/IP协议:
网络通信中经常用到这个两个协议
TCP负责数据传输 IP负责寻址
3.Java中如何使用网络通信编写程序?
1.使用TCP方式编写程序
TCP: 传输控制协议
面向连接的,可靠的传输协议
面向连接:在传输数据之前,必须要先在两个程序之间建立连接
在数据传输的时候,必须要保证对方收到了数据
数据传输结束之后,要断开连接
面向连接就类似于打电话
TCP是如何保证传输的可靠性的?
1.通过三次握手建立连接
2.数据传输过程
数据顺序:给每个数据包一个编号
丢包重传:对方收到数据报之后必须要给一个响应数据,如果没有收到响应数据,就重新传输该数据报
重复数据:每个数据包有一个校验码
3.通过四次挥手断开连接
优点:可靠,能保证对方一定可以收到数据
确定:占用的资源多
2.使用UDP方式编写程序
UDP: 用户数据报协议
无连接的,不可靠的传输协议
无连接:传输数据的时候,不需要建立连接
不可靠:不保证对方一定会收到数据
类似于发短信
优点:占用资源少
缺点:不可靠
3.Java中用TCP的相关类
ServerSocket 服务端套接字
Socket 客户端套接字
InetAddress 封装IP和端口的 网路地址
开发步骤:
a.编写服务端程序
ServerSocket server = new ServerSocket(9090);
Socket socket = server.accept();
b.客户端程序
Socket scoket = new Socket("服务端IP",服务端端口);
4.Java中用UDP的相关类
InetSocketAddress 封装IP和端口的 网路地址
DatagramSocket UDP的套接字
DatagramPacket UDP的数据报
服务端
Myserver类
import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 服务端类 */ public class MyServer { //存放客户端套接字的数组 public static final ArrayList<Socket> list = new ArrayList<>(); public static void main(String[] args) throws Exception{ //创建可缓存的线程池,可以根据任务数来创建线程 ExecutorService pools = Executors.newCachedThreadPool(); //创建一个服务端套接字对象ServerSocket,指定端口为10001 ServerSocket server = new ServerSocket(10001); System.out.println("服务器已经启动,正在10001端口等待..."); while(true) { //等待并接受客户端的套接字对象 //当有客户端连接上服务端的时候,就返回连接上来的客户端套接字 //如果没有客户端连接,就一直等待 Socket socket = server.accept(); System.out.println("收到一个客户端:" + socket); list.add(socket); //通过socket对象获得字节输出流 OutputStream ops = socket.getOutputStream(); //将字节流包装成字符流 OutputStreamWriter osw = new OutputStreamWriter(ops); //将字符流包装成缓冲流 BufferedWriter out = new BufferedWriter(osw); //写出数据 out.write("欢迎光临!\n"); out.flush(); //由于需要不停的读取客户端的消息 //此处是并行的,有多少个客户端,就要有多少并行的单元 ChatClient cc = new ChatClient(socket); //通过线程池启动任务 pools.execute(cc); } } }
ChatClient类
import java.io.*; import java.net.Socket; /** * 处理一个客户端的线程 */ public class ChatClient implements Runnable{ private Socket socket; public ChatClient(Socket socket){ this.socket = socket; } @Override public void run() { try { String threadName = Thread.currentThread().getName(); //服务端接受客户端发送来的消息 InputStream ips = socket.getInputStream(); //包装成字符流 InputStreamReader isr = new InputStreamReader(ips); //包装成缓冲流 BufferedReader br = new BufferedReader(isr); //不停的接受客户端发来的消息 while (true) { //接受数据 String msg = br.readLine(); System.out.println("服务端收到:"+threadName+"的消息:" + msg); //遍历list,取出所有的socket,再获得输出流,在发送消息 for(int i=0;i<MyServer.list.size();i++){ Socket sc = MyServer.list.get(i); //不需要发给自己 if(sc!=socket){ //通过socket对象获得字节输出流 OutputStream ops = sc.getOutputStream(); //将字节流包装成字符流 OutputStreamWriter osw = new OutputStreamWriter(ops); //将字符流包装成缓冲流 BufferedWriter out = new BufferedWriter(osw); out.write(msg+"\n"); out.flush(); } } } }catch (Exception ef){ ef.printStackTrace(); } } }
客户端
MyClient类
import java.io.*; import java.net.Socket; import java.util.Scanner; import java.util.logging.SocketHandler; /** * 网络通信客户端 */ public class MyClient { public static void main(String[] args) throws Exception{ //创建客户端套接字对象 //需要传入要连接的服务端的IP和端口 //本机地址: localhost 127.0.0.1都可以 Socket socket = new Socket("localhost",10001); //启动收消息的线程 ReceiveThread rt = new ReceiveThread(socket); rt.start(); //给服务端发送消息 //通过socket对象获得字节输出流 OutputStream ops = socket.getOutputStream(); //将字节流包装成字符流 OutputStreamWriter osw = new OutputStreamWriter(ops); //将字符流包装成缓冲流 BufferedWriter out = new BufferedWriter(osw); //从控制台输入数据,并发送给服务端 Scanner sc = new Scanner(System.in); //客户端不停的发消息 while(true) { System.out.print("请输入消息:"); //接受控制台输入的消息 String str = sc.nextLine(); //将消息发送给服务端 out.write(str + "\n"); out.flush(); } } }
ReceiveThread类
import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.Socket; public class ReceiveThread extends Thread{ private Socket socket; public ReceiveThread(Socket socket){ this.socket = socket; } @Override public void run() { try { //从socket上获得字节输入流 InputStream ips = socket.getInputStream(); //包装成字符流 InputStreamReader isr = new InputStreamReader(ips); //包装成缓冲流 BufferedReader br = new BufferedReader(isr); while(true) { //读取一行数据,读到 \n 结尾 String msg = br.readLine(); System.out.println("客户端收到:" + msg); } }catch (Exception ef){ ef.printStackTrace(); } } }
4.网络环境监测?
1.检查两台设备是否在同一个局域网
2.查看本机IP地址 ipconfig
3.检查是否可以相互ping通
ping不同的原因:1.网络不通
2.防火墙未关闭
Window10如何关闭防火墙
1.
.
2.

3.检查系统是否禁用了ping功能

浙公网安备 33010602011771号