JavaDay23总结学习

一、笔记

网络安全
网络:
即是计算机网络: 是不同地区,通过网络来传递数据,来进行数据的交互
网络编程的三大要素:

1. ip 2.端口号 3.协议

套接字的定义:

应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。
多个TCP连接或多个应用程序进程可能需要 通过同一个TCP协议端口传输数据。
为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字 (Socket)的接口,区分不同应用程序进程间的网络通信和连接。

ip:ip 是每一台电脑的唯一标识
两种分类:

 ip4:是由0-255组成,是四个字节   一般网络都192.168==>c类网络   a类一般政府(军事用途),
 一般子网络是: 10.08      本地的特殊的ip 是 127.0.0.1(this)   
查看当前电脑的ip地址 ipconfig     拼服务器是否连通了,也就是拼ip地址(重点)

ip6 :是由8个数组数组,四个16精制组成

java 提供获取ip的类 InetAddress

public static InetAddress getLocalHost()  返回本地主机
public String getHostAddress() 获取ip地址
public String getHostName()   获取ip的主机名:public String getHostName()

端口号:每一个软件(每一个进程的唯一标识)

端口号:

当软件开启之后,系统给其生成的一个,也可以自己去设置,
当软件开启是端口号系统产生,当软件关闭的时候,回收

用软件的端口号:

  • Tomcat: 8080
  • oracle:1521
  • mysql:3306
  • qq:4000
  • 邮箱的端口号: 网易 137

协议: 各个计算机网络传输的一个规范
协议分为7层
传输层 : TCP UDP + xmpp 协议 ==> 即时通讯(qq,微信)

TCP 与 UDP的区别:

UDP面向无连接的协议: 传输的数据快,但是可以会丢数据(cts飞q) 会出现卡顿
TCP 面向连接的协议: 传输慢,不会丢失数据(三次握手) ==>qq传消息 文字需要准确性,使用的就是这个协议

web阶段主要: http 协议 https 协议

http 与https==>都是属于一次性的连接==>也就是客户端给服务器发送请求,当交互完,这个请求就断开了
https =http+ssl 证书,这个证书保证数据的传输的安全性  大部分上线的网站都会使用https协议 

面向协议来进行通信 :TCP 做一个对象
Socket 对象: 接字是两台机器间通信的端点。
Socket构造方法

public Socket(String host,int port)   如果是本机ip地址传递localhost
传递两个参数   一个ip地址, 一个是端口号 (女孩子的微信号)
                                

常规的方法

public OutputStream getOutputStream()throws IOException  写数据的流对象
public InputStream getInputStream()throws IOException  读取数据的对象
public void shutdownOutput()throws IOException 类似于flush()方法 

客户端(女孩子)==> 发送消息的过程

1.实例化这个socket对象  
2.通过socket对象 得到输出流 OutputStream
3.调用  write()
4.shutdownOutput()
5.拿到输入流 InputStream
6.new BufferReader(new InputStreamReader(new FileInputStream))
7.关闭资源

ServerSocket 此类实现服务器套接字
构造 :

public ServerSocket(int port) 需要与客户端的端口号一样

常用的方法:

public Socket accept()throws IOException  监听客户端发送的消息,返回一个Socket

服务器(男子)

1.实例化ServerSocke 
2. 调用  accept() 返回的是一个socket对象
3.拿到输入流 InputStream
4. new BufferReader(new InputStreamReader(new FileInputStream))
5.得到OutputStream 对象
6.调用  write()
7.shutdownOutput()
8.关闭资源

注意:运行的时候,要先运行服务器,再运行客户端

如果有两个客户端, 一个服务器,就会产生这样一个错误
Connection refused: connect
解决这个问题 : 用多线程解决这个问题 : 解决多个客户端对应一个服务器的问题
代码如下:(具体实现)

// 第一个客户端
    public static void main(String[] args) {
        try {
            Socket socket=new Socket("localhost",2328);
            OutputStream os=socket.getOutputStream();
            //InputStream is=socket.getInputStream();
            os.write("我要吃鸡腿".getBytes());
            socket.shutdownOutput();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
// 第二个客户端
    public static void main(String[] args) {
        try {
            Socket socket=new Socket("localhost",2328);
            OutputStream os=socket.getOutputStream();
            InputStream is=socket.getInputStream();
            os.write("我要吃大鸡腿".getBytes());
            socket.shutdownOutput();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


//线程
public class MyThread extends Thread {
    private Socket socket;

    public MyThread(Socket socket) {
        this.socket = socket;
    }

    // 重写服务器代码 run方法
    @Override
    public void run() {
        try {
           // ServerSocket serverSocket = new ServerSocket(2328);
           // Socket socket=serverSocket.accept();
            InputStream is=socket.getInputStream();
           // OutputStream os=socket.getOutputStream();
            BufferedReader br=new BufferedReader(new InputStreamReader(is));
            String str=null;
            while ((str=br.readLine())!=null){
                System.out.println(str);

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


// 服务器
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket=new ServerSocket(2328);
            Socket socket=null;
            while (true){
                socket=serverSocket.accept();
 				MyThread myThread=new MyThread(socket);
                myThread.start();



                /* InputStream is=socket.getInputStream();
                OutputStream os=socket.getOutputStream();
                BufferedReader br=new BufferedReader(new InputStreamReader(is));
                String str=null;
                while ((str=br.readLine())!=null){
                    System.out.println(str);

                }
                socket.shutdownInput();
                socket.close();  */
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

使用socket实现文件上传的功能

// 客户端
public static void main(String[] args) {
        try {
        FileInputStream fis=new FileInputStream(new File("D:\\小电影2\\刘亦菲.jpg"));
        Socket socket=new Socket("localhost",10110);
        OutputStream os = socket.getOutputStream();
            byte[] b=new byte[1024];
            int leng=-1;
            while ((leng=fis.read(b))!=-1){
                os.write(b,0,leng);

            }
            socket.shutdownOutput();
            os.flush();
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

}



// 服务器
   public static void main(String[] args) {
        try {
            File file=new File("E:\\图片库");
            if (!file.exists()){
                file.mkdirs();
            }
            String str=System.currentTimeMillis()+"";
            File file1=new File(file,str+".jpg");
            FileOutputStream fos=new FileOutputStream(file1);

            ServerSocket serverSocket=new ServerSocket(10110);
            Socket socket=serverSocket.accept();
            InputStream is= socket.getInputStream();
            byte[] b=new byte[1024];
            int leng=-1;
            while ((leng=is.read(b))!=-1){

                    fos.write(b,0,leng);
                    fos.flush();
            }
            socket.shutdownInput();

            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

socket实现文件上传的功能步骤总结

客户端:
1.读取出需要上传的图片
2 .通过socket拿到的输出流写入到服务器
                                                       
服务器:  
1.通过socket拿到输入流把图片读取出来  
注意:(1.需要创建一个文件夹来保存所有的图片,2.避免图片被覆盖)
 
2.保存在本地

以上都是基于tcp协议来进行操作的:面向连接  传输的时候不会丢失数据,但是传输慢

UDP
基于UDP协议进行传输,类似于发包裹

传输的类主要是 DatagramSocket 此类表示用来发送和接收数据报包的套接字

DatagramSocket构造方法:

 public DatagramSocket(int port,InetAddress laddr)  第一个数端口号    第二个参数是地址
 public DatagramSocket(int port)参数是端口号

常规的方法:

public void send(DatagramPacket p)throws IOException 发送数据包 
public void receive(DatagramPacket p)throws IOException  接收数据包 

两个重要的构造方法:

DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) 
DatagramPacket(byte[] buf, int length) 
DatagramPacket  此类表示数据报包  (包裹对象)
第一个参数是 字节数组  
第二个参数是从字节数组的什么地方开始 
第三个是到什么结束
第四个:获取的ip对象
第五个就是端口号 

重要的方法:

public SocketAddress getSocketAddress() 返回的就是SocketAddress
public byte[] getData()   获取缓冲区的数据

客户端的步骤: 基于UDP的客户端

1.实例化这个对象
2.构建一个数据包
3..发送数据
4.关闭资源

服务器: 基于UDP的服务器

1. 实例化这个对象DatagramSocket
2. 构建一个包裹对象
3.接收数据  receive()
4.关闭资源

例子代码:

// 客服端
 public static void main(String[] args) {
        try {
            while (true){
                //String str="你好,我是客服端!";
                String str=new Scanner(System.in).next();
                DatagramSocket datagramSocket=new DatagramSocket();
                InetAddress inetAddress=InetAddress.getByName("localhost");
                DatagramPacket dp=new DatagramPacket(str.getBytes(),0,str.getBytes().length,inetAddress,8990);
                datagramSocket.send(dp);

                // 接收信息
                byte[] b=new byte[1024];
                DatagramPacket dp1=new DatagramPacket(b,b.length);
                datagramSocket.receive(dp1);
                byte[] by=  dp1.getData();
                System.out.println(new String(by,0,by.length));
            }
       } catch (IOException e) {
            e.printStackTrace();
        }
    }


// 服务器
    public static void main(String[] args) {
        try {
            DatagramSocket datagramSocket=new DatagramSocket(8990);
            while (true){
                byte[] b=new byte[1024];
                DatagramPacket dp=new DatagramPacket(b,b.length);
                datagramSocket.receive(dp);
                byte[] by=dp.getData();
                System.out.println(new String(by,0,by.length));

                // 回复信息
                //String st="我已经接收到了。";
                String st=new Scanner(System.in).next();
                SocketAddress address=dp.getSocketAddress();
                DatagramPacket dp1=new DatagramPacket(st.getBytes(),0,st.getBytes().length,address);
                datagramSocket.send(dp1);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }


    }

基于udp比较繁琐, 没有获取流对象的方法,所有只能够按照以上的方法区操作
开发使用的是第三方 环信与融云(sdk) tcp+udp 即时通信

二、总结

第二十三天的学习,今天学习了网络编程,主要学习了TCP与UDP协议以及基于两者的编程,内容比昨天少点,理解起来也没做昨天的难,而且今天学习的内容有点趣味性。加油干。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值