网络编程

来源:互联网 发布:2017年淘宝用户数量 编辑:程序博客网 时间:2024/05/16 02:46

一 网络编程概述

  • 计算机网络

是指将地理位置不同的具有独立功能的计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

  • 网络编程

就是用来实现网络互联的不同计算机运行的程序间可以进行数据交换。

  • 网络模型
    • 计算机网络之间以何种规则进行通信,就是网络模型研究的问题
    • 网络模型一般是指
OSI 参考模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 TCP/IP 参考模型 应用层 传输层 网络层 主机至网络层

二 网络编程三要素

1. IP地址

  • 定义

计算机在网络中的唯一标示,计算机只能识别二进制的数据,所以IP地址应该是二进制的数据,但是配置IP地址时,却不是二进制数据,为了方便人记忆,换算成十进制。

  • 组成

网络号段+主机号段

  • 命令

    • ipconfig:查看ip地址
    • ping+IP地址 :测试网络通信是否正常

2. port端口号

  • 定义

正在运行的程序的标示

  • 组成
    • 有效端口号:0~65535
    • 系统保留端口号:0~1024

3. 协议

  • 定义

通信规则

  • 分类

    • UDP

    将数据源和目的地封装在数据包中,数据包的大小限制在64K以内。它不需要建立连接,所以速度快,但是不可靠。

    • TCP

    需要通过三次握手建立连接,形成传输通道,在连接的通道中进行大量数据传输,因为需要建立连接,是可靠协议,所以效率低。

    TCP协议也叫作三次握手协议,第一次 请求向对方发送数据,第二次对方同意发送数据,第三次发送数据。

  • 总结

    • UDP:发短信
    • TCP:打电话

    一般的软件既有UDP协议,也有TCP协议。它需要UDP的速度快,也需要TCP协议的可靠性。

三 Socket 编程

  • 定义

socket 编程就是网络编程,也被称为网络套接字编程。网络上具有唯一标示的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。

  • 原理

    • 通信的两端都有Socket
    • 网络通信其实就是Socket间的通信
    • 数据在两个Socket间在某种协议下通过IO传输
  • 实现

    • 通过UDP协议实现
-------------- 发送--------------/* * 数据来自于键盘录入 * 键盘录入数据要自己控制录入结束。 */public class SendDemo {    public static void main(String[] args) throws IOException {        // 创建发送端的Socket对象        DatagramSocket ds = new DatagramSocket();        // 封装键盘录入数据        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        String line = null;        while ((line = br.readLine()) != null) {            if ("886".equals(line)) {                break;            }            // 创建数据并打包            byte[] bys = line.getBytes();            // DatagramPacket dp = new DatagramPacket(bys, bys.length,            // InetAddress.getByName("192.168.12.92"), 12345);            DatagramPacket dp = new DatagramPacket(bys, bys.length,                    InetAddress.getByName("192.168.12.255"), 12345);            // 发送数据            ds.send(dp);        }        // 释放资源        ds.close();    }}-------------- 接受--------------/* * 多次启动接收端: *      java.net.BindException: Address already in use: Cannot bind *      端口被占用。 */public class ReceiveDemo {    public static void main(String[] args) throws IOException {        // 创建接收端的Socket对象        DatagramSocket ds = new DatagramSocket(12345);        while (true) {            // 创建一个包裹            byte[] bys = new byte[1024];            DatagramPacket dp = new DatagramPacket(bys, bys.length);            // 接收数据            ds.receive(dp);            // 解析数据            String ip = dp.getAddress().getHostAddress();            String s = new String(dp.getData(), 0, dp.getLength());            System.out.println("from " + ip + " data is : " + s);        }        // 释放资源        // 接收端应该一直开着等待接收数据,是不需要关闭        // ds.close();    }}
  • 通过TCP协议实现
-------------- 发送--------------/* * TCP协议发送数据: * A:创建发送端的Socket对象 *      这一步如果成功,就说明连接已经建立成功了。 * B:获取输出流,写数据 * C:释放资源 *  * 连接被拒绝。TCP协议一定要先看服务器。 * java.net.ConnectException: Connection refused: connect */public class ClientDemo {    public static void main(String[] args) throws IOException {        // 创建发送端的Socket对象        // Socket(InetAddress address, int port)        // Socket(String host, int port)        // Socket s = new Socket(InetAddress.getByName("192.168.12.92"), 8888);        Socket s = new Socket("192.168.12.92", 8888);        // 获取输出流,写数据        // public OutputStream getOutputStream()        OutputStream os = s.getOutputStream();        os.write("hello,tcp,我来了".getBytes());        // 释放资源        s.close();    }}-------------- 接受--------------/* * TCP协议接收数据: * A:创建接收端的Socket对象 * B:监听客户端连接。返回一个对应的Socket对象 * C:获取输入流,读取数据显示在控制台 * D:释放资源 */public class ServerDemo {    public static void main(String[] args) throws IOException {        // 创建接收端的Socket对象        // ServerSocket(int port)        ServerSocket ss = new ServerSocket(8888);        // 监听客户端连接。返回一个对应的Socket对象        // public Socket accept()        Socket s = ss.accept(); // 侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。        // 获取输入流,读取数据显示在控制台        InputStream is = s.getInputStream();        byte[] bys = new byte[1024];        int len = is.read(bys); // 阻塞式方法        String str = new String(bys, 0, len);        String ip = s.getInetAddress().getHostAddress();        System.out.println(ip + "---" + str);        // 释放资源        s.close();        // ss.close(); //这个不应该关闭    }}
原创粉丝点击