网络编程概述及实例练习

原创 2017年10月12日 21:57:56

一、网络编程概述

1.网络模型

    计算机网络之间以何种规则进行通信,就是网络模型研究问题。
    网络模型一般是指OSI(OpenSystem Interconnection开放系统互连)参考模型
    TCP/IP参考模型

网络参考模型图

二、网络编程三要素

1.IP地址:InetAddress

网络中设备的标识,不易记忆,可用主机名
要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接受数据的计算机和识别发送的计算机,在TCP/IP协议中,这个标识号就是IP地址。

那么,我们如果获取和操作IP地址呢?
为了方便我们对IP地址的获取和操作,java提供了一个类InetAddress 供我们使用。
没有构造方法,那么如何使类提供的功能呢?

要掌握的功能
获取任意主机:getByName

    主机名:getHostName
    主机Ip地址:getHostAddress

2.端口号

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

物理端口 网卡口
逻辑端口 我们指的就是逻辑端口
A:每个网络程序都会至少有一个逻辑端口
B:用于标识进程的逻辑地址,不同进程的标识
C:有效端口:0~65535,其中0~1024系统使用或保留端口。
通过360可以查看端口号

3.传输协议

通讯的规则
常见协议:TCP,UDP

三、UDP编程

1.UDP

    将数据源和目的封装成数据包中,不需要建立连接;每个数据报的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快。

UDP协议发送接收图解

2.UDP编程小例子

(1).多线程实现eclipse下显示UDP通信

ChatRomm.java

package cn.itcast_05;

import java.io.IOException;
import java.net.DatagramSocket;

public class ChatRoom {
    public static void main(String[] args) throws IOException {
        DatagramSocket dsSend = new DatagramSocket();
        DatagramSocket dsReReceive = new DatagramSocket(12306);

        SendThread st = new SendThread(dsSend);
        ReceiveThread rt = new ReceiveThread(dsReReceive);

        Thread t1 = new Thread(st);
        Thread t2 = new Thread(rt);
        t1.start();
        t2.start();

    }
}   


----------


ReceiveThread.java
package cn.itcast_05;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveThread implements Runnable {
    private DatagramSocket dsReceive;
    public ReceiveThread(DatagramSocket dsReceive) {
        this.dsReceive = dsReceive;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            while (true) {
                byte[] bys = new byte[1024];
                DatagramPacket dp = new DatagramPacket(bys, bys.length);
                dsReceive.receive(dp);
                String ip = dp.getAddress().getHostAddress();
                String s = new String(dp.getData(), 0, dp.getLength());
                System.out.println("from  " + ip + "  data is: " + s);
            }
        } catch (IOException e) {
            // TODO: handle exception
        }   
    }
}


----------


SendThread.java
package cn.itcast_05;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendThread implements Runnable {
    private DatagramSocket dsSend;
    public SendThread(DatagramSocket dsSend) {
        this.dsSend = dsSend;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            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.1.103"),
                        12306);
                dsSend.send(dp);
            }
            dsSend.close();
        } catch (IOException e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

}

四、TCP编程

1.TCP

    建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低。

2.TCP编程小例子

TCP协议发送和接收图解

UserThread.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class UserThread implements Runnable {
    private Socket s;

    public UserThread(Socket s) {
        this.s = s;
    }

    @Override
    public void run() {
        try {
            // 封装通道内的流
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    s.getInputStream()));
            String newName = System.currentTimeMillis() + ".java";
            BufferedWriter bw = new BufferedWriter(new FileWriter(newName));

            String line = null;
            while ((line = br.readLine()) != null) { // 阻塞
                bw.write(line);
                bw.newLine();
                bw.flush();
            }

            // 给出反馈
            BufferedWriter bwServer = new BufferedWriter(
                    new OutputStreamWriter(s.getOutputStream()));
            bwServer.write("文件上传成功");
            bwServer.newLine();
            bwServer.flush();

            // 释放资源
            bw.close();
            s.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}


----------
UploadClient.java

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.Socket;

    public class UploadClient{
        public static void main(String[] args) throws IOException {
            // 创建客户端Socket对象
            Socket s = new Socket("192.168.1.103", 11111);

            // 封装文本文件
            // BufferedReader br = new BufferedReader(new FileReader(
            // "InetAddressDemo.java"));
            BufferedReader br = new BufferedReader(new FileReader(
                    "a.txt"));
            // 封装通道内流
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
                    s.getOutputStream()));

            String line = null;
            while ((line = br.readLine()) != null) { // 阻塞
                bw.write(line);
                bw.newLine();
                bw.flush();
            }

            // Socket提供了一个终止,它会通知服务器你别等了,我没有数据过来了
            s.shutdownOutput();

            // 接收反馈
            BufferedReader brClient = new BufferedReader(new InputStreamReader(
                    s.getInputStream()));
            String client = brClient.readLine(); // 阻塞
            System.out.println(client);

            // 释放资源
            br.close();
            s.close();
        }
    }


----------
UploadServer.java


import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class UploadServer {
    public static void main(String[] args) throws IOException {
        // 创建服务器Socket对象
        ServerSocket ss = new ServerSocket(11111);

        while (true) {
            Socket s = ss.accept();
            new Thread(new UserThread(s)).start();
        }
    }
}

五、Socket

Socket套接字:

网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。

Socket原理机制:

通信的两端都有Socket。网络通信其实就是Socket间的通信。数据在两个Socket间通过IO传输。

这里写图片描述

InetAddress类的使用

    获取任意主机:getByName    
    主机名:getHostName
    主机Ip地址:getHostAddress
版权声明:本文为博主原创文章,未经博主允许不得转载。

浅析Ajax跨域原理及JQuery中的实现分析

AJAX 的出现使得网页可以通过在后台与服务器进行少量数据交换,实现网页的局部刷新。但是出于安全的考虑,ajax不允许跨域通信。如果尝试从不同的域请求数据,就会出现错误。如果能控制数据驻留的远程服务器...
  • danmo01
  • danmo01
  • 2014年12月04日 16:50
  • 265

集合框架_增强for的概述和使用

package cn.itcast_01; import java.util.ArrayList; import java.util.Iterator; import java.util.List;...
  • L1585931143
  • L1585931143
  • 2016年12月25日 14:26
  • 182

JAVA进阶之旅(一)——增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法

JAVA进阶之旅(一)——增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法 学完我们的java之旅,其实收获还是很多的,但是依然还...
  • qq_26787115
  • qq_26787115
  • 2016年09月25日 18:32
  • 1564

网络编程概述及Http协议

(一)概述 本节开始我们来学习Android网络编程相关的一些东西:Android端网络编程要干嘛?Http协议 的学习,使用自带扣脚Json解析类解析Json,XML解析的几种常用方式,Http...
  • MakeYourChance
  • MakeYourChance
  • 2016年07月05日 20:56
  • 4063

DOS概述及入门(读书笔记)

1.DOS的启动 DOS系统启动时,要先从启动盘读取IO.SYS、MSDOS.SYS,然后在启动盘的根目录下寻找并执行CONFIG.SYS、COMMAND.COM、AUTOEXEC.BAT三...
  • wang740209668
  • wang740209668
  • 2016年08月30日 22:19
  • 242

黑马程序员——Set集合概述及特点

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- Set集合概述及特点  Set集合特点:无顺序不可重复 注意:我们学习set,它的方法没有特殊,...
  • wnk77521
  • wnk77521
  • 2015年04月29日 01:48
  • 490

JUnit4概述及实例

JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写。 先简单解释一下什么是Annotation,这个单词一般是翻译成元数据。元数...
  • haoliyanzhanghao
  • haoliyanzhanghao
  • 2014年03月20日 11:15
  • 322

USB电池充电规范1.2版概述及充电检测器的重要角色

http://www.eepw.com.cn/article/273341_2.htm
  • u013615357
  • u013615357
  • 2016年09月23日 09:36
  • 535

集合框架_泛型概述和基本使用

package cn.itcast_01; import java.util.ArrayList; import java.util.Iterator; /* * ArrayList存储字符串并...
  • L1585931143
  • L1585931143
  • 2016年12月24日 01:20
  • 226

键值数据库—Redis(一) 基础入门

redis 是一个基于内存的高性能key-value数据库
  • lengyuhong
  • lengyuhong
  • 2010年08月10日 14:50
  • 3913
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:网络编程概述及实例练习
举报原因:
原因补充:

(最多只允许输入30个字)