• 黑马程序员_Java学习日记num11


    ------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

    学习内容:网络概述  TCP和UDP  一个示例 一,网络概述

    1,OSI/RM
    根据OSI/RM参考模型,将网络分为七层,分别是应用层,表示层,会话层,传输层,网络层,数据链路层和物理层。每一层上都有对应的协议,协议可以理解为通信规则。
    2,TCP/IP参考模型 应用层,传输层,网际层,主机至网络层。在我们的现实网络中,由于OSI/RM参考模型分层太多,我们只是把他作为一个标准参考,使用的是TCP/IP协议。
    3,网络通信要素 IP地址:唯一标识一台计算机 网络中设备的标识; 不易记忆,可用主机名; 本地回环地址:127.0.0.1 主机名 localhost。 端口号: 用于标识进程的逻辑地址,不同进程的标识; 有效端口:0-65535;其中0-1024系统使用或者保留端口。 常见的端口:Mysql 3306 传输协议: 通讯的规则; 常见的协议:TCP UDP。
    二,UDP和TCP 1,UDP 将数据及源和目的封装成数据包中,不需要建立连接。 每个数据报的大小限制在64K内。 因无连接,是不可靠协议。 不需要建立连接,速度快。 2,TCP 建立连接,形成传输数据的通道。 在连接中进行大数据量传输。 通过三次握手完成连接,是可靠协议。 必须建立连接,效率会稍低。 三,TCP和UDP的建立 1,socket socket就是为网络服务提供的一种机制。 通信的两端都有Socket。 网络通信就是Socket间的通信。 数据在两个Socket间通过IO传输。
    2,UDP发送流程, 1.建立udpsocket服务。 2.提供数据,并将数据封装到数据包中。 3.通过socket服务的发送功能,将数据包发出去。 4.关闭资源。
     
    3,udp接收端
    1,建立udpsocket服务
    2,通过DatagramPacket建立数据包对象以便于获取接受的数据包
    3,通过DatagramPacket中的getData等等方法,可以获取相对应的数据信息
    4,关闭服务 一个UDP示例:
    需求:将UDP的发送端和接收端封装到两个线程中,实现局域网的UDP聊天应用小程序
    class Send implements Runnable{//将发送端封装到线程中
    public void run(){
    try {
    DatagramSocket ds = new DatagramSocket();
                            //读取键盘录入
    BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
    String line = null;
    while((line = bufr.readLine()) != null){
    break;
    }
    byte[] buf = line.getBytes();
    DatagramPacket dp = 
    new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10000);
    ds.send(dp);
    ds.close();
    } catch (SocketException e) {
    e.printStackTrace();
    } catch (UnknownHostException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    class Rec implements Runnable{//将接收端封装到线程中
    public void run(){
    try {
    DatagramSocket ds = new DatagramSocket(10000);
    byte[] buf = new byte[1024];
    DatagramPacket dp = new DatagramPacket(buf,buf.length);
    ds.receive(dp);
    System.out.println("ip:"+dp.getAddress());
    System.out.println("data:"+new String(dp.getData(),0,dp.getLength()));
    ds.close();
    } catch (SocketException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    4,TCP传输 Socket和ServerSocket 1,tcp分客户端和服务端。 2,客户端对应的对象是Socket。 服务端对应的对象是ServerSocket。
    客户端,通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机。 因为tcp是面向连接的。所以在建立socket服务时, 就要有服务端存在,并连接成功。形成通路后,在该通道进行数据的传输。 同样,客户端与服务器端是两个独立的应用程序。
    4,一个示例:TCP的多线程上传
    多线程的上传需要服务器端多线程接受,所以服务器要定义为多线程
    import java.io.*;
    import java.net.*;
    class  PicClient
    {
    public static void main(String[] args)throws Exception 
    {
    Socket s = new Socket("192.168.1.254",10007);
    FileInputStream fis = new FileInputStream(file);
    OutputStream out = s.getOutputStream();
    byte[] buf = new byte[1024];
    int len = 0;
    while((len=fis.read(buf))!=-1)
    {
    out.write(buf,0,len);
    }
     
    //告诉服务端数据已写完
    s.shutdownOutput();
    InputStream in = s.getInputStream();
    byte[] bufIn = new byte[1024];
    int num = in.read(bufIn);
    System.out.println(new String(bufIn,0,num));
    fis.close();
    s.close();
    }
    }
    服务端
    class PicThread implements Runnable
    { private Socket s;
    PicThread(Socket s)
    {
    this.s = s;
    }
    public void run()
    {
    int count = 1;
    String ip  = s.getInetAddress().getHostAddress();
    try
    {
    System.out.println(ip+"....connected");
    InputStream in = s.getInputStream();
    File dir =  new File("d:\pic");
    File file = new File(dir,ip+"("+(count)+")"+".jpg");
    while(file.exists())
    file = new File(dir,ip+"("+(count++)+")"+".jpg");
    FileOutputStream fos = new FileOutputStream(file);
    byte[] buf = new byte[1024];
    int len = 0;
    while((len=in.read(buf))!=-1)
    {
    fos.write(buf,0,len);
    }
    OutputStream out = s.getOutputStream();
    out.write("上传成功".getBytes());
    fos.close();
    s.close();
    }
    catch (Exception e)
    {
    throw new RuntimeException(ip+"上传失败");
    }
    }
    }
     
     
     
    class  PicServer
    {
    public static void main(String[] args) throws Exception
    {
    ServerSocket ss = new ServerSocket(10007);
    while(true)
    {
    Socket s = ss.accept();
    new Thread(new PicThread(s)).start();
    }
     
    //ss.close();
    }
    }
  • 相关阅读:
    使用分析函数进行行列转换
    SQL模糊查询
    Web服務器的配置方法
    oracle基礎知識2
    oracle基礎知識9
    在客户端脚本中获取Session的方法
    推荐litianping的几篇文章,包括owc统计图,rss技术,项目常用类,petshop架构分析
    Asp.net生成工作流、审批流的解决方案(asp.net workflow svg)
    DiscuzNT 1.0正式版推出了
    web.config中的特殊字符串xml中的非法字符串
  • 原文地址:https://www.cnblogs.com/Rebecca-gg/p/4468950.html
Copyright © 2020-2023  润新知