zoukankan      html  css  js  c++  java
  • java网络编程

    一.网络模型

    OSI参考模型

    数据从上到下逐层传递标识封装该层特有信息成为数据包,最后通过最底层进行物理传输,接收之后由底层往上层开始逐层对应拆包解析数据。每一层都有自己的规则和协议。
    1,应用层,2,表示层,3,会话层,4,传输层,5,网络层,6,数据链路层,7,物理层。

    TCP/IP参考模型

    TCP/IP参考模型是OSI参考模型的一种简化,原理一致。
    1,应用层,2,传输层,3,网际层,4,主机至网络层。
    应用层http协议,传输层TCP/ip协议,网际层IP协议。

    网络通讯基本三要素
    1.IP地址

    网络中设备的标识,不易记忆,可用主机名,本地回环地址;127.0.0.1,本地主机名localhost,主机名与IP地址相对应。末尾为0时是网络段,末尾为255时是广播段,都能收到
    2.端口号

    用于标识进程的逻辑地址,不同进程的标识。

    有效端口0到65535,其中0到1024是系统保留端口。

    3.传输协议

    通信规则即传输协议,国际组织定义了通用协议(Internet协议)TCP/IP协议,UDP协议

    二.TCP和UDP

    1.UDP
    将数据及源和目的封装成数据包中,不需要建立连接
    每个数据包的大小在限制在64K内
    因无连接,是不可靠协议
    不需要建立连接,速度快。
    2.TCP
    建立连接,形成传输数据的通道
    在连接中进行大数据量传输
    通过三次握手完成连接,是可靠协议
    必须建立连接,效率会稍低。

    3.Socket(英文翻译插座)
    Socket就是为网络服务提供的一种机制
    每个通信的两端都有Socket
    网络通信其实就是Socket间的通信
    数据在两个Socket间通过IO传输。

    三.UDP传输

    UDP传输的Socket服务
    DatagramSocket类,DatagramPacket数据包类
    发送端需求;通过udp传输方式,将一段文字数据发送出去
    思路
    1,建立udpsocket服务
    2,提供数据,并将数据封装到数据包中
    3,通过socket服务的发送功能,将数据包发送出去
    4,关闭资源
    接收端需求;定义一个应用程序用于接收udp协议传输的数据并处理数据
    思路
    1,定义udpsocket服务,监听一个端口定义一个数字标识如果不定义会自动分配一个
    2,定义一个数据包,因为要存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数据中的不同数据信息
    3,通过socket服务的receive方法将接收到的数据存入已定义好的数据包中。该方法时个阻塞方法。
    4,通过数据包对象的特有功能。将这些不同的额数据取出,并打印在控制台
    5,关闭资源。

    有收数据的部分和发数据的部分
    这两部分需要同时执行,
    那就需要用到多线程技术
    一个线程控制收,一个线程控制发。

    import java.net.*;
    class  UdpSend
    {
        public static void main(String[] args) throws Exception
        {
            //1,创建udp服务。通过DatagramSocket对象。
            DatagramSocket ds = new DatagramSocket(8888);
    
            //2,确定数据,并封装成数据包。
    
            byte[] buf = "udp ge men lai le ".getBytes();
            DatagramPacket dp = 
                new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.254"),10000);
    
            //3,通过socket服务,将已有的数据包发送出去。通过send方法。
            ds.send(dp);
    
            //4,关闭资源。
    
            ds.close();
    
        }
    }
    class  UdpRece
    {
        public static void main(String[] args) throws Exception
        {
            //1,创建udp socket,建立端点。
            DatagramSocket ds = new DatagramSocket(10000);
            while(true)
            {
            //2,定义数据包。用于存储数据。
            byte[] buf = new byte[1024];
            DatagramPacket dp = new DatagramPacket(buf,buf.length);
    
            //3,通过服务的receive方法将收到数据存入数据包中。
            ds.receive(dp);//阻塞式方法。
            
    
            //4,通过数据包的方法获取其中的数据。
            String ip = dp.getAddress().getHostAddress();
    
            String data = new String(dp.getData(),0,dp.getLength());
    
            int port = dp.getPort();
    
            System.out.println(ip+"::"+data+"::"+port);
    
            }
            //5,关闭资源可选操作
            ds.close();
    
        }
    }

    四.TCP传输

    客户端
    通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机。
    因为tcp是面向连接的。所以在建立socket服务时,就要有服务端存在,并连接成功,形成桐庐后,在该通道进行数据的传输。
    步骤
    1,创建Socket服务,并指定要连接的主机和端口。通路一建立就能够拿到socket流其中封装了输入流和输出流
    2,为了发送数据,应该获取socket流中的输出流

    服务端
    需求;定义端点接收数据并打印在控制台上
    1,建立服务端的cocket服务。ServerSocket()并监听一个端口
    2,获取链接过来的客户端对象,通过Serversoket的accpet方法,没有连接就会等,所以这个方法阻塞式的
    3,客户端发过来的数据,那么服务端要使用对应的客户端对象,并获取到该对象的读取流。
    4,关闭客户端,可选关闭服务端

    import java.io.*;
    import java.net.*;
    class  TcpClient
    {
        public static void main(String[] args) throws Exception 
        {
            //创建客户端的socket服务。指定目的主机和端口
            Socket s = new Socket("192.168.1.254",10003);
            
            //为了发送数据,应该获取socket流中的输出流。
            OutputStream out = s.getOutputStream();
    
            out.write("tcp ge men lai le ".getBytes());
    
    
            s.close();
        }
    }
    class  TcpServer
    {
        public static void main(String[] args) throws Exception
        {
            //建立服务端socket服务。并监听一个端口。
            ServerSocket ss = new ServerSocket(10003);
    
            //通过accept方法获取连接过来的客户端对象。
            while(true)
            {
            Socket s = ss.accept();
    
            String ip = s.getInetAddress().getHostAddress();
            System.out.println(ip+".....connected");
    
            //获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据。
            InputStream in = s.getInputStream();
            
            byte[] buf = new byte[1024];
            int len = in.read(buf);
    
            System.out.println(new String(buf,0,len));
    
            s.close();//关闭客户端.
            }
            //ss.close();
        }
    }

    Tcp传输最容易出现的问题
    客户端连接上服务端,两端都在等待,没
    有任何数据传输。
    通过例程分析:
    因为read方法或者readLine方法是阻塞式。
    解决办法:
     自定义结束标记
     使用shutdownInput,shutdownOutput方法。

  • 相关阅读:
    Asp.net弹出浏览器客户端确认对话框代码 Carlwave
    VS 2005 与SQL Server 2005整合优势在哪里?(from csdn.net) Carlwave
    如何让搜索引擎收录我的站点 Carlwave
    超强扩展性的DNNDotNetNuke模块功能分类列表(from 中国DNN) Carlwave
    DotNetNuke命名空间概述 Carlwave
    Most Popular Questions and Answers on ASP.NET Whidbey(from asp.net forums,write by ASP.NET Team) Carlwave
    火箭官方宣告麦蒂缺阵五周 季后赛前景蒙上阴影 Carlwave
    asp.net有效使用缓存(转) Carlwave
    《Business Rules Engine Overview》《业务规则引擎概述》write by Mark Kamoski Carlwave
    中国详细省市县自治区名称列表(含access数据库和sql2000备份数据库) Carlwave
  • 原文地址:https://www.cnblogs.com/ss561/p/4575068.html
Copyright © 2011-2022 走看看