第十二次总结 网络分层,传输

  1. 网路分层模型是什么?
  2. 通信协议:有哪些?
  3. Java中如何使用网络通信编写程序?
  4. 网络环境监测?

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功能

 

posted @ 2020-08-03 20:49  Zc小白  阅读(319)  评论(0)    收藏  举报