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

    网络编程三要素:
        A:IP地址   
        B:端口 
        C:协议
    IP地址:
        网络中计算机的唯一标识。
        
        计算机只能识别二进制的数据,所以我们的IP地址应该是一个二进制的数据。
        但是呢,我们配置的IP地址确不是二进制的,为什么呢?
            IP:192.168.1.100
            换算:11000000 10101000 00000001 01100100
        假如真是:11000000 10101000 00000001 01100100的话。
        我们如果每次再上课的时候要配置该IP地址,记忆起来就比较的麻烦。
        所以,为了方便表示IP地址,我们就把IP地址的每一个字节上的数据换算成十进制,然后用.分开来表示:
            "点分十进制"
            
        IP地址的组成:网络号段+主机号段
            A类:第一号段为网络号段+后三段的主机号段
                一个网络号:256*256*256 = 16777216
            B类:前二号段为网络号段+后二段的主机号段
                一个网络号:256*256 = 65536
            C类:前三号段为网络号段+后一段的主机号段
                一个网络号:256
        
        IP地址的分类:
            A类    1.0.0.1---127.255.255.254    (1)10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址)                            (2)127.X.X.X是保留地址,用做循环测试用的。
            B类    128.0.0.1---191.255.255.254    172.16.0.0---172.31.255.255是私有地址。169.254.X.X是保留地址。
            C类    192.0.0.1---223.255.255.254    192.168.X.X是私有地址
            D类    224.0.0.1---239.255.255.254     
            E类    240.0.0.1---247.255.255.254
            
        两个DOS命令:
            ipconfig 查看本机ip地址
            ping 后面跟ip地址。测试本机与指定的ip地址间的通信是否有问题
            
        特殊的IP地址:
            127.0.0.1 回环地址(表示本机)
            x.x.x.255 广播地址
            x.x.x.0 网络地址
            
    端口号:
        正在运行的程序的标识。
        有效端口:0~65535,其中0~1024系统使用或保留端口。
        
    协议:
        通信的规则
        
        UDP:                                        
            把数据打包
            数据有限制
            不建立连接
            速度快
            不可靠
        
        TCP:
            建立连接通道
            数据无限制
            速度慢
            可靠
        
        举例:
            UDP:发短信
            TCP:打电话

    UDP协议接收数据:
     A:创建接收端Socket对象
     B:创建一个数据包(接收容器)
      C:调用Socket对象的接收方法接收数据
     D:解析数据包,并显示在控制台
      E:释放资源

    public class ReceiveDemo {
        public static void main(String[] args) throws IOException {
            // 创建接收端Socket对象
            // DatagramSocket(int port)
            DatagramSocket ds = new DatagramSocket(10086);
    
            // 创建一个数据包(接收容器)
            // DatagramPacket(byte[] buf, int length)
            byte[] bys = new byte[1024];
            int length = bys.length;
            DatagramPacket dp = new DatagramPacket(bys, length);
    
            // 调用Socket对象的接收方法接收数据
            // public void receive(DatagramPacket p)
            ds.receive(dp); // 阻塞式
    
            // 解析数据包,并显示在控制台
            // 获取对方的ip
            // public InetAddress getAddress()
            InetAddress address = dp.getAddress();
            String ip = address.getHostAddress();
            // public byte[] getData():获取数据缓冲区
            // public int getLength():获取数据的实际长度
            byte[] bys2 = dp.getData();
            int len = dp.getLength();
            String s = new String(bys2, 0, len);
            System.out.println(ip + "传递的数据是:" + s);
    
            // 释放资源
    // 接收端应该一直开着等待接收数据,是不需要关闭
    // ds.close(); } }

    UDP协议发送数据:
     * A:创建发送端Socket对象
     * B:创建数据,并把数据打包
     * C:调用Socket对象的发送方法发送数据包
     * D:释放资源

    public class SendDemo {
        public static void main(String[] args) throws IOException {
            // 创建发送端Socket对象
            // DatagramSocket()
            DatagramSocket ds = new DatagramSocket();
    
            // 创建数据,并把数据打包
            // DatagramPacket(byte[] buf, int length, InetAddress address, int port)
            // 创建数据
            byte[] bys = "hello,udp,我来了".getBytes();
            // 长度
            int length = bys.length;
            // IP地址对象
            InetAddress address = InetAddress.getByName("192.168.12.92");
            // 端口
            int port = 10086;
            DatagramPacket dp = new DatagramPacket(bys, length, address, port);
    
            // 调用Socket对象的发送方法发送数据包
            // public void send(DatagramPacket p)
            ds.send(dp);
    
            // 释放资源
            ds.close();
        }
    }

        数据来自于键盘录入
          键盘录入数据要自己控制录入结束。

    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();
        }
    }

    通过多线程改进刚才的聊天程序,这样我就可以实现在一个窗口发送和接收数据了

    public class SendThread implements Runnable {
    
        private DatagramSocket ds;
    
        public SendThread(DatagramSocket ds) {
            this.ds = ds;
        }
    
        @Override
        public void run() {
            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.12.92"), 12345);
                    DatagramPacket dp = new DatagramPacket(bys, bys.length,
                            InetAddress.getByName("192.168.12.255"), 12306);
    
                    // 发送数据
                    ds.send(dp);
                }
    
                // 释放资源
                ds.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }
    
    
    public class ReceiveThread implements Runnable {
        private DatagramSocket ds;
    
        public ReceiveThread(DatagramSocket ds) {
            this.ds = ds;
        }
    
        @Override
        public void run() {
            try {
                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);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }
    
    
    
    
    public class ChatRoom {
        public static void main(String[] args) throws IOException {
            DatagramSocket dsSend = new DatagramSocket();
            DatagramSocket dsReceive = new DatagramSocket(12306);
    
            SendThread st = new SendThread(dsSend);
            ReceiveThread rt = new ReceiveThread(dsReceive);
    
            Thread t1 = new Thread(st);
            Thread t2 = new Thread(rt);
    
            t1.start();
            t2.start();
        }
    }

    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(); //这个不应该关闭
        }
    }

    TCP协议发送数据:
     * A:创建发送端的Socket对象
     *         这一步如果成功,就说明连接已经建立成功了。
     * B:获取输出流,写数据
     * C:释放资源

    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();
        }
    }

    客户端键盘录入,服务器输出到控制台

    public class ClientDemo {
        public static void main(String[] args) throws IOException {
            // 创建客户端Socket对象
            Socket s = new Socket("192.168.12.92", 22222);
    
            // 键盘录入数据
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            // 把通道内的流给包装一下
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
                    s.getOutputStream()));
    
            String line = null;
            while ((line = br.readLine()) != null) {
                // 键盘录入数据要自定义结束标记
                if ("886".equals(line)) {
                    break;
                }
                bw.write(line);
                bw.newLine();
                bw.flush();
            }
    
            // 释放资源
            // bw.close();
            // br.close();
            s.close();
                }    
    }
    
    
    
    public class ServerDemo {
        public static void main(String[] args) throws IOException {
            // 创建服务器Socket对象
            ServerSocket ss = new ServerSocket(22222);
    
            // 监听客户端连接
            Socket s = ss.accept();
    
            // 包装通道内容的流
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    s.getInputStream()));
            String line = null;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
    
            // br.close();
            s.close();
            // ss.close();
        }
    }

    客户端文本文件,服务器输出到控制台

    public class ClientDemo {
        public static void main(String[] args) throws IOException {
            // 创建Socket对象
            Socket s = new Socket("192.168.12.92", 34567);
    
            // 封装文本文件
            BufferedReader br = new BufferedReader(new FileReader(
                    "InetAddressDemo.java"));
            // 封装通道内的流
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
                    s.getOutputStream()));
    
            String line = null;
            while ((line = br.readLine()) != null) {
                bw.write(line);
                bw.newLine();
                bw.flush();
            }
    
            br.close();
            s.close();
        }
    }
    
    public class ServerDemo {
        public static void main(String[] args) throws IOException {
            // 创建服务器Socket对象
            ServerSocket ss = new ServerSocket(34567);
    
            // 监听客户端连接
            Socket s = ss.accept();
    
            // 封装通道内的流
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    s.getInputStream()));
    
            String line = null;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
    
            
            s.close();
        }
    }
  • 相关阅读:
    Item02.多态 Polymorphism
    使用Singleton需要考虑内存释放
    Item08. 多级指针(Pointers to Pointers)
    Item01: 数据提取(Data Abstraction)
    Item 05. 引用(References Are Aliases, Not Pointers)
    华为3Com Quidway 2116SI
    DLink DES1226G 一款不错的中端交换机
    郁闷
    一些VLAN学习资料
    有个好心情才会有好的状态
  • 原文地址:https://www.cnblogs.com/lsymove/p/11258144.html
Copyright © 2011-2022 走看看