网络编程

为什么学习网络编程呢?好玩呗,哈哈,废话不多说


以前我么查看自己的IP地址可以去Dos窗体里面,现在可以通过java程序的代码来实现了

java提供该类   InetAddress提供我么使用

但是我么发现  InetAddress这个类没有构造方法,怎么办呢?

这个时候我么想起单例模式了,应该有getInetAddress()方法返回  InetAddress对象的
但是,这个方法的名字不是上面的,而是  static InetAddress getLocalHost()  该方法返回一个InetAddress对象的

好了如何获取IP地址呢?

1,我么要创建InetAddress对象。
2,调用InetAddress对象的方法String getHostAddress()  返回以String类型的IP地址

非常简单把,下面代码体现:

        public class InetAddressTest {
        public static void main(String[] args) throws IOException {
            
            //获取到InetAddress对象
            InetAddress ia = InetAddress.getLocalHost();
        
            //好了上面已经获取到了对象了,那么接下来做什么呢,获取IP把
            String s = ia.getHostAddress();
            
            //最后输出IP
            System.out.println(s);
            
        }
    }

    非常简单吧,哈哈!!!!


    下面就是UDP编程了,这个有点不好理解呢。


    UDP编程要写接收端和发送端,这样吧,我么先写接收端在写发送端,其实写哪边都是一样的
    个人爱好。


    接收端的主要思路步骤:

    1,创建Socket服务对象
    2,调用功能,解析数据包,显示数据
    3,释放资源

    更具上面的思路步骤我么代码来体现以下把

    接收端有个类叫DatagramSocket,我么查看API先把

    “此类表示用来发送和接收数据报包的套接字。”  DatagramSocket类不仅可以接收还可以发送呢,所以发送数据也是用该类

    该类有构造方法,并且有“空”构造

    我么使用public DatagramSocket(int port)这个构造方法使用确定端口号,只有通过该端口才能进行访问

    好了假设对象有了,那么接下来就是调用功能解析数据包并显示数据了

    解析数据包之前需要接收到数据包把,所以我么首先调用接收数据包的方法
    
    receive(DatagramPacket p)   从此套接字接收数据报包。

    DatagramPacket是一个类,我么先去API里面查看一下有哪些功能和方法

    该类中显示出DatagramPacket(byte[] buf, int length, InetAddress)   构造数据报包,用来将长度为 length 的包发送到指定主机上

    我么通过这个类了解,可以定义字节数组大小为1024,用数组.length

    好了,下面来解析数据包把,使用DatagramSocket对象的     getAddress() 方法返回InetAddress类型并在此调用InetAddress类中的getHostAddress()
    返回IP。

    解释一下:
                首先我么调用getAddress()是返回某机器的IP,然后因为是InetAddress数据类型因此可以调用获取IP的方法
                为什么需要这个呢??到时候谁发送的消息通过IP就可以知道的。

            
        接下来在创建一个字节数据调用public byte[] getData()返回数据缓冲区。接收到的或将要发送的数据从缓冲区中的偏移量 offset 处开始,持续 length 长度。

        并使用getLength()获取长度,

        并用String来接受发送的消息,把字节数组加入0,getLength()

        本人语言组织能力感觉不强,实现没看懂我上面说什么就直接看代码把,如果写错了请指出

        直接代码体现:

            
        public class ReceiveDemo {
        public static void main(String[] args) throws IOException {
        
        //创建Socket对象,该类用于接收数据
        DatagramSocket ds = new DatagramSocket();
    
        //DatagramPacket对象创建
        byte buf[] = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);
        
        //接收数据包,接收的数据包里面的数据类型是DatagramPacket,所以在此之前先创建DatagramPacket对象
        ds.receive(packet);
        
        //数据包已经接收到了,下面就是解析数据包了,有点麻烦,我么该怎么做?
    
        /*
         *         1,我么可以获取到IP知道是谁发送的数据
         *         2,数据介解析后我么要知道长度是哪里到哪里的,不然数据可能会现混乱的
         */
        
        String ip = packet.getAddress().getHostAddress();    //getAddress返回但是 InetAddress然后通过 InetAddress返回IP
        
        byte by[] = packet.getData();    //返回数据缓冲区,从缓冲区中的偏移量 “起始处 ” 开始,持续 length 长度。
        
        String s = new String(by,0,by.length);        //这就是获取到的数据长度,
        
        System.out.println(ip+"..."+s);
        
        //最后关闭资源
        ds.close();
    }
}
        
        
好了,接收端已经写好了,再写发送端咯。

明确发送端思路步骤

1,创建UDP的发送Socket服务对象
2,创建数据,数据打包,发送数据
3,关闭资源


        上面我么知道DatagramScoket类是具有方式和接收的功能的,所以还是创建DatagramSocket对象

好了对象已经明确了,接下来的是什么呢?

        创建数据
                1,接收端的DatagramPacket类接收的只是byte,所以我么发送要更具该类写,所以是一个byte类型
                2,然后明确数组的长度
                3,在给点计算机名获取到ip
                4,明确端口,和接收端的端口一致
                

        好了剩下的工作就是发送出去了,如何发送出去呢?

        DatagramPacket(byte[] buf, int length, InetAddress address, int port)
            构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

            最后使用Socket对象中的send()方法发送数据包

            最后一步就是释放资源。

        
        
代码体现:
            public class SendDemo {
            public static void main(String[] args) throws IOException {
                
                //创建Socket对象
                DatagramSocket socket = new DatagramSocket();
            
                //对象创建好了以后就是创建数据以及打包并发送数据,更具接收端得知我么要更具DatagrmPacket类来创建
                byte[] by = "Socket编程挺难的".getBytes();
                int len = by.length;
                InetAddress ia = socket.getInetAddress().getByName("itcast-121");    //更具主机名获取到ip
                int pot = 10088;      //端口号与接收端一致
                
                DatagramPacket packet = new DatagramPacket(by, len, ia,pot);
                
                //数据打包后,发送出去把
                socket.send(packet);
                
                //关闭资源
                socket.close();
                
            }
        }

        小提示,想要运行先运行接收端在运行发送端











下面就是TCP编程了。

TCP把上面的两端称为   服务器,和,客户端

服务器接收消息,客户端发送消息


下面我么还是来写服务器吧:
    
    思路步骤:
                1,创建Socket对象
                2,监听并接受连接此服务器的客户端
                3,获取输入流数据,并显示
                4,释放资源

    ServerSocket  此类实现服务器套接字
    
    我么使用        ServerSocket(int port)      创建绑定到特定端口的服务器套接字。
    只能通过该端口来进行访问。

    如何监听呢?
     Socket accept()      侦听并接受到此套接字的连接。此方法在连接传入之前一直处于阻塞状态。
    
     查看API得知Socket有个获取 InputStream这个字节流对象
    
    定义一个byte数组,存放数据1024

    定义一个int接收数组中的元素

    最后使用String把字节数组 转换成字符串

    最后释放资源


    代码体现:

       public class ServerSocketTest {
    public static void main(String[] args) throws IOException {
        
        //创建对象
        ServerSocket ss = new ServerSocket(11111);
        
        //监听并连接
        Socket sk = ss.accept();
        
        //获取输入流对象
        InputStream is = sk.getInputStream();
        
        byte by[] = new byte[1024];
        
        int len = is.read(by);
        
        String str = new String(by,0,len);    //获取数据,就重0到len的长度
        
        System.out.println(str);
        
        sk.close();
        //一般我是不建议服务器关闭的,服务器是不关的,但是我么这样的小程序没意思还是关闭吧
        ss.close();
    }
}
     

       


服务器已经写好了,那么我么开始写客户端吧

步骤思路:
            1,创建客户端的Socket对象
            2,建立通道,通道成功后,就可以使用Socket对象的IO流操作。
            3,关闭资源

            Socket可以返回输出流OutputStream,可以通过它写入数据
            最后关闭资源


    代码体现:
            public class ClientDemo {
            public static void main(String[] args) throws IOException {
                
                    //创建对象
                Socket socket = new Socket(InetAddress.getByName("itcast-121"),11111);
                
                //Socket可以返回输入流对象
                OutputStream os = socket.getOutputStream();
                
                //往里面写入数据
                os.write("TCP挺好的".getBytes());
                
                socket.close();
            }
        }

        好了以上就是我对网络编程的基础认识,写的不好多多包涵
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值