My_Campus项目 Week2

一、周一(2018/4/9) Association

package association;

import cn.bmob.v3.BmobObject;
import cn.bmob.v3.datatype.BmobFile;

/**
 * Created by Lijing on 2018/4/9.
 */

//每个社团的详细信息
public class Association extends BmobObject {
    private String name;
    private String info;
    private boolean if_orginzation;
    private BmobFile image;
    private String imagepath;
    private String assID;

    public Association() {
    }

    public Association(String name, String info,  boolean if_orginzation,String assID,BmobFile image,String imagepath) {
        this.name = name;
        this.info = info;
        this.if_orginzation = if_orginzation;
        this.imagepath=imagepath;
        this.assID=assID;
        this.image=image;
    }

    public String getAssID() {
        return assID;
    }

    public void setAssID(String assID) {
        this.assID = assID;
    }

    public String getImagepath() {
        return imagepath;
    }

    public void setImagepath(String imagepath) {
        this.imagepath = imagepath;
    }

    public BmobFile getImage() {
            return image;
        }

        public void setImage(BmobFile image) {
            this.image = image;
        }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    /*public boolean isIf_quality() {
        return if_quality;
    }

    public void setIf_quality(boolean if_quality) {
        this.if_quality = if_quality;
    }*/

    public boolean isIf_orginzation() {
        return if_orginzation;
    }

    public void setIf_orginzation(boolean if_orginzation) {
        this.if_orginzation = if_orginzation;
    }
}

二、周二(2018/4/10)AssociationAdapter

package association;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;


import com.example.jing.student.R;

import java.util.List;

import yue.FullImage;
import yue.GetImageByUrl;

/**
 * Created by Lijing on 2018/4/10.
 */

//显示社团信息的的Adapter
public class AssociationAdapter extends RecyclerView.Adapter<AssociationAdapter.ViewHolder>
{
    List<Association> massociation;
    private Context context;
    ViewHolder viewholder;
    Bitmap bitmap;
    static class ViewHolder extends RecyclerView.ViewHolder{
        ImageView assImage;
        TextView assName;
        public ViewHolder(View v){
            super(v);
            assImage=(ImageView)v.findViewById(R.id.ass_image);
            assName=(TextView)v.findViewById(R.id.ass_text);
        }

    }
    public AssociationAdapter(Context context,List<Association> associations){
        this.context=context;
        massociation=associations;
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.ass_item,parent,false);
         viewholder=new ViewHolder(view);
        return viewholder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        final Association a = massociation.get(position);
        holder.assName.setText(a.getName());
        holder.assName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder builder = new AlertDialog.Builder(context);
                builder.setMessage(a.getInfo());
                builder.setPositiveButton("确定",null);
                builder.show();
            }
        });
        holder.assImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(context, FullImage.class);
                intent.putExtra("imageUrl",a.getImagepath());
                context.startActivity(intent);
            }
        });
        GetImageByUrl getImageByUrl = new GetImageByUrl();
        getImageByUrl.setImage(holder.assImage,a.getImagepath());
    }

    @Override
    public int getItemCount() {
        return massociation.size();
    }
}

三、周三(2018/4/11)AssRegisteActivity

package association;

import android.Manifest;
import android.annotation.TargetApi;
import android.content.ContentUris;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RadioGroup;
import android.widget.Toast;


import com.example.jing.student.R;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.datatype.BmobFile;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.FindListener;
import cn.bmob.v3.listener.SaveListener;
import cn.bmob.v3.listener.UpdateListener;
import cn.bmob.v3.listener.UploadFileListener;

/**
 * Created by Lijing on 2018/4/11.
 */

public class AssRegisteActivity extends AppCompatActivity {
    private String number;
     private Uri imageUri;
    public static final int TAKE_PHOTO=1;
    public static final int CHOOSE_PHOTO=2;
    ImageView asso_image;
    File outImage;
    boolean havePic=false;
    boolean iforg=false;//默认为社团
   private   String assNumber;
    EditText asso_name;
    EditText asso_info;
  private   String queryID=null;
   private  String imagePath=null;
    boolean take_photos=false;
    boolean get_photos=false;
     BmobFile bmobFile;
     int temp;
     EditText ass_id;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.association_registe_info);
        SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        number=format.format(new Date());
        //查询有几个组织了

     /*  BmobQuery<Association> query=new BmobQuery<>();
        query.findObjects(new FindListener<Association>() {
            @Override
            public void done(List<Association> list, BmobException e) {
                if(e==null){
                    temp=list.size()+1;
                }
            }
        });*/
//        if(temp<10){
//            assNumber="000"+temp;
//        }else if(temp<100){
//            assNumber="00"+temp;
//        }else if(temp<1000){
//            assNumber="0"+temp;
//        }else{
//            assNumber=""+temp;
//        }

        initAsso();
        //获取社团号
       // assNumber=getIntent().getExtras();
    }
    public void initAsso(){
        ass_id=(EditText)findViewById(R.id.ass_id);
        asso_image=(ImageView)findViewById(R.id.asso_image);
        asso_name=(EditText)findViewById(R.id.asso_name_et);
        asso_info=(EditText)findViewById(R.id.asso_info_et);
//        RadioButton ass_choose=(RadioButton)findViewById(R.id.ass_choose);
//        RadioButton org_choose=(RadioButton)findViewById(R.id.org_choose);
        final RadioGroup radioGroup=(RadioGroup)findViewById(R.id.ass_group);
        // RadioButton radioButton=(RadioButton)findViewById( radioGroup.getCheckedRadioButtonId()) ;
        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                if(checkedId==R.id.ass_choose){
                    iforg=false;
                }else{
                    iforg=true;
                }
            }
        });
        final Button take_photo=(Button)findViewById(R.id.asso_image_btn_take);
        Button choose_photo=(Button)findViewById(R.id.asso_image_btn_choose);
        take_photo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                take_photos=true;
                get_photos=false;
                number=number+".jpg";
                outImage=new File(getExternalCacheDir(),number);
                try {
                    if(outImage.exists()){
                        outImage.delete();
                    }
                    outImage.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if(Build.VERSION.SDK_INT>=24){
                    imageUri= FileProvider.getUriForFile(AssRegisteActivity.this,
                            "com.example.cameraalbumtest.fileprovider",outImage);
                }else{
                    imageUri= Uri.fromFile(outImage);
                }
                Intent intent=new Intent("android.media.action.IMAGE_CAPTURE");
                intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
                startActivityForResult(intent,TAKE_PHOTO);


            }
        });
        choose_photo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                take_photos=false;
                get_photos=true;
                number=number+".jpg";
                outImage=new File(getExternalCacheDir(),number);
                try {
                    if(outImage.exists()){
                        outImage.delete();
                    }
                    outImage.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if(Build.VERSION.SDK_INT>=24){
                    imageUri= FileProvider.getUriForFile(AssRegisteActivity.this,
                            "com.example.cameraalbumtest.fileprovider",outImage);
                }else{
                    imageUri= Uri.fromFile(outImage);
                }
                if(ContextCompat.checkSelfPermission(AssRegisteActivity.this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
                    ActivityCompat.requestPermissions(AssRegisteActivity.this,new String[]{
                            Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
                }else{
                    openAlbum();
                }
            }
        });

        Button submit_btn=(Button)findViewById(R.id.asso_info_submit);
        submit_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(AssRegisteActivity.this, "提交中请稍后", Toast.LENGTH_SHORT).show();

                BmobQuery<Association> bmobquery=new BmobQuery<>();
                bmobquery.addWhereEqualTo("assID",ass_id.getText().toString());
                bmobquery.findObjects(new FindListener<Association>() {
                    @Override
                    public void done(List<Association> list, BmobException e) {
                        if(e==null){
                            if(list.size()!=0){
                                queryID=list.get(0).getObjectId();
                                Association assTem=new Association();
                                assTem.setObjectId(queryID);
                                assTem.delete(new UpdateListener() {
                                    @Override
                                    public void done(BmobException e) {
                                        if(e==null){
                                            Log.e("删除数据","成功");
                                        }else{
                                            Log.e("删除数据","失败");
                                        }
                                    }
                                });
                            }
                            registChangeInfo();
                        }
                    }
                });


            }
        });
    }

    public void registChangeInfo(){
        if(asso_name.getText().toString()!=null&&asso_info.getText().toString()!=null&&havePic){
            if(take_photos){
                compressPicture(outImage.getAbsolutePath(),outImage.getAbsolutePath());
                bmobFile= new BmobFile(outImage);

            }else{
                compressPicture(imagePath,imagePath);
                 bmobFile = new BmobFile(new File(imagePath));
            }

            bmobFile.upload(new UploadFileListener() {
                @Override
                public void done(BmobException e) {
                    if(e==null){
                        // String u=bmobFile.getFileUrl();//--返回的上传文件的完整地址
                        Association ass = new Association(asso_name.getText().toString(),asso_info.getText().toString(),iforg,ass_id.getText().toString(),bmobFile,bmobFile.getFileUrl());
                        Log.e("adc",asso_name.getText().toString()+asso_info.getText().toString()+iforg+ass_id.getText().toString()+bmobFile.getFileUrl());
                        ass.save(new SaveListener<String>() {
                            @Override
                            public void done(String s, BmobException e) {
                                Toast.makeText(AssRegisteActivity.this, "上传成功", Toast.LENGTH_SHORT).show();
                                finish();
                            }
                        });
                    }else{
                        Log.e("上传失败",""+e);
                        Toast.makeText(AssRegisteActivity.this, "上传失败", Toast.LENGTH_SHORT).show();
                    }
                }
            });

        }else{
            Toast.makeText(AssRegisteActivity.this, "您填写的信息不完整", Toast.LENGTH_SHORT).show();
        }
    }


    private void openAlbum(){
        Intent intent =new Intent("android.intent.action.GET_CONTENT");
        intent.setType("image/*");
        startActivityForResult(intent,CHOOSE_PHOTO);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode){
            case 1:
                if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
                    openAlbum();
                }else{
                    Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode){
            case TAKE_PHOTO:
                if(resultCode==RESULT_OK){
                    try {
                        Bitmap bitmap= BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                        asso_image.setImageBitmap(bitmap);
                        havePic=true;
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
                break;
            case CHOOSE_PHOTO:
                if(resultCode==RESULT_OK){
                    if(Build.VERSION.SDK_INT>=19){
                        handleImageOnKitKat(data);
                    }else{
                        handleImageBeforKitKat(data);
                    }
                }
                break;
            default:
                break;
        }
    }
    @TargetApi(19)
    private void handleImageOnKitKat(Intent data){

        Uri uri=data.getData();
        if(DocumentsContract.isDocumentUri(this,uri)){
            String docId =DocumentsContract.getDocumentId(uri);
            if("com.android.providers.media.documents".equals(uri.getAuthority())){
                String id =docId.split(":")[1];//解析出数据格式
                String selection =MediaStore.Images.Media._ID+"="+id;
                imagePath=getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,selection);
            }else if("com.android.provider.doenloads.documents".equals(uri.getAuthority())){
                Uri contentUri= ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),Long.valueOf(docId));
                imagePath=getImagePath(contentUri,null);
            }
        }else if("content".equalsIgnoreCase(uri.getScheme())){
            imagePath=getImagePath(uri,null);
        }else if("file".equalsIgnoreCase(uri.getScheme())){
            imagePath=uri.getPath();
        }
        Log.e("imagepath",imagePath);
        Log.e("uri",""+uri.toString());
        displayImage(imagePath);
        Bitmap bitmap= null;
        try {
            bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        asso_image.setImageBitmap(bitmap);
        havePic=true;
    }
    private void handleImageBeforKitKat(Intent data){
        Uri uri=data.getData();
        String imagePath=getImagePath(uri,null);
        displayImage(imagePath);
        Bitmap bitmap= null;
        try {
            bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        Log.e("Before",uri.toString());
        asso_image.setImageBitmap(bitmap);
        havePic=true;
    }

    private String getImagePath(Uri uri,String selection){
        String path=null;
        Cursor cursor=getContentResolver().query(uri,null,selection,null,null);
        if(cursor!=null){
            if(cursor.moveToFirst()){
                path=cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            }
            cursor.close();
        }
        return path;

    }
    private void displayImage(String imagePath){
        if(imagePath!=null){
            Bitmap bitmap=BitmapFactory.decodeFile(imagePath);
            asso_image.setImageBitmap(bitmap);
            havePic=true;
        }
        else{
            Toast.makeText(this, "failed to get image", Toast.LENGTH_SHORT).show();
        }
    }
    private void compressPicture(String srcPath, String desPath) {
        FileOutputStream fos = null;
        BitmapFactory.Options op = new BitmapFactory.Options();

        // 开始读入图片,此时把options.inJustDecodeBounds 设回true了
        op.inJustDecodeBounds = true;
        Bitmap bitmap = BitmapFactory.decodeFile(srcPath, op);
        op.inJustDecodeBounds = false;

        // 缩放图片的尺寸
        float w = op.outWidth;
        float h = op.outHeight;
//        Toast.makeText(WriteLostActivity.this,""+w+"  "+h,Toast.LENGTH_SHORT).show();
        float hh = 1024f;//
        float ww = 1024f;//
        float be = 3.0f;
        if(w * h >3000 * 4000){
            be = 15.0f;
        }else if(w * h > 2000 * 3000){
            be = 6.0f;
        }
        // 最长宽度或高度1024

        op.inSampleSize = (int) be;// 设置缩放比例,这个数字越大,图片大小越小.
        // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
        bitmap = BitmapFactory.decodeFile(srcPath, op);
        int desWidth = (int) (w / be);
        int desHeight = (int) (h / be);
        bitmap = Bitmap.createScaledBitmap(bitmap, desWidth, desHeight, true);
        try {
            fos = new FileOutputStream(desPath);
            if (bitmap != null) {
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

}

四、周四(2018/4/12)GetImageByUrl

package association;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * Created by Lijing on 2018/4/12.
 */

public class GetImageByUrl {
    private PicHandler pic_hdl;
    private ImageView imgView;
    private String url;

    public void setImage(ImageView imgView, String url) {
        this.url = url;
        this.imgView = imgView;
        pic_hdl = new PicHandler();
        Thread t = new LoadPicThread();
        t.start();
    }


    class LoadPicThread extends Thread {
        @Override
        public void run() {
            Bitmap img = getUrlImage(url);
            Message msg = pic_hdl.obtainMessage();
            msg.what = 0;
            msg.obj = img;
            pic_hdl.sendMessage(msg);
        }
    }

    class PicHandler extends Handler {

        @Override
        public void handleMessage(Message msg) {
            Bitmap myimg = (Bitmap) msg.obj;
            imgView.setImageBitmap(myimg);
        }

    }

    public Bitmap getUrlImage(String url) {
        Bitmap img = null;
        try {
            URL picurl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection) picurl
                    .openConnection();
            conn.setConnectTimeout(9000);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            conn.connect();
            InputStream is = conn.getInputStream();
            img = BitmapFactory.decodeStream(is);
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return img;
    }
}

五、周五(2018/4/13)MyListview

package association;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;

/**
 * Created by Lijing on 2018/4/13.
 */

public class MyListview extends ListView {
    public MyListview(Context context) {
        super(context);
    }

    public MyListview(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyListview(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}


六、周六 (2018/4/14)RegisterActivity

package association;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;

import com.example.jing.student.R;

import java.util.ArrayList;
import java.util.List;

import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.FindListener;

/**
 * Created by Lijing on 2018/4/14.
 */

public class RegisteActivity extends AppCompatActivity {
    private List<Association> associations=new ArrayList<>();
    private RecyclerView recyclerView;
    private ImageView she_back;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_registe);
        setPic();

        she_back = (ImageView)findViewById(R.id.she_back);
        she_back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }
    public void setPic(){
         recyclerView=(RecyclerView)findViewById(R.id.recycler_view);
        StaggeredGridLayoutManager layoutManager=new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(layoutManager);
        SpacesItemDecoration decoration=new SpacesItemDecoration(16);
        recyclerView.addItemDecoration(decoration);
        initAssInfo();

    }
    public void initAssInfo(){
        BmobQuery<Association> query=new BmobQuery<Association>();
        query.findObjects(new FindListener<Association>() {
            @Override
            public void done(List<Association> list, BmobException e) {
                if(e==null){
                    associations=list;
//                    Log.e("适配器设置",""+list.size());
                    AssociationAdapter adapter=new AssociationAdapter(RegisteActivity.this,associations);
                    recyclerView.setAdapter(adapter);
//                    Log.e("适配器","设置成功");
                }
            }
        });
    }

}

七、周日(2018/4/15)SpacesItemDecoration

package association;

import android.graphics.Rect;
import android.support.v7.widget.RecyclerView;
import android.view.View;

/**
 * Created by Lijing on 2018/4/15.
 */

public class SpacesItemDecoration  extends RecyclerView.ItemDecoration{
    private int space;

    public SpacesItemDecoration(int space) {
        this.space=space;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        outRect.left=space;
        outRect.right=space;
        outRect.bottom=space;
        if(parent.getChildAdapterPosition(view)==0){
            outRect.top=space;
        }
    }
}

campus_network.topo指的是校园网络的拓扑结构。校园网络是连接学校内各个计算机、服务器和其他网络设备的网络系统。拓扑结构则是描述网络中各个节点之间连接关系的方式。 校园网络的拓扑结构通常是基于分层结构设计的。一般来说,校园网络可以分为三个层次:核心层、汇聚层和接入层。核心层是校园网络中最重要的一层,负责处理大量的网络流量传输。核心层通常由高容量交换设备构成,能够保证网络的高可靠性和高性能。汇聚层是连接核心层和接入层的中间层,负责连接各个部门或学院的子网络。接入层是与终端设备直接相连的一层,负责提供用户接入服务。 在校园网络的拓扑结构中,还可以考虑纵向划分和横向划分。纵向划分指的是将整个校园网络按照楼宇、建筑或区域进行划分,每个划分单元内可以有独立的核心层、汇聚层和接入层设备。这样可以在不同的区域内提供更好的网络服务。横向划分指的是将整个校园网络按照不同的部门、学院或功能进行划分,每个划分单元内可以有独立的核心层、汇聚层和接入层设备。这样可以在不同的部门或学院内提供更好的网络管理和控制。 校园网络的拓扑结构还可以根据具体需求进行定制化设计。可以根据网络规模、用户数量、业务需求和预算等因素来确定最适合的拓扑结构。比如,对于大型校园网络来说,可以采用分布式的拓扑结构,将核心层、汇聚层和接入层设备分布在不同的位置,以提高网络的可用性和可扩展性。 总之,campus_network.topo是指校园网络的拓扑结构,通过合理的设计和规划,可以提供高性能、高可靠性的网络服务,满足校园内各类用户的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值