14-网络编程基础

14-网络编程基础,第1张

14-网络编程基础

网络编程基础
  • 网络编程
    • InetAddress类
    • 常用方法
    • 协议
    • UDP的三种通讯方式
    • 三次握手
    • 四次挥手

网络编程
  • 再网络通讯写一下,不同计算机上运行的程序,可以进行数据传输。

网络编程三要素

  1. 网络IP地址----------设备再网络中的地址,时唯一标识
  2. 端口号-----------------应用再设备中唯一的标识
  3. 传输协议---------------数据再网络中传输的规则,常用的协议有UDP和TCP

IPv4

32bit == 4组 ===8bit为一组
采用点分十进制表示法进行表示

IPv6

128bit地址长度,分为8组,两字节分为一组
冒分十六进制表示,前面有零可以省略

InetAddress类 常用方法
public class InetAddressDemo1 {
    public static void main(String[] args) throws Exception {
        //static InetAddress getByName(String host)确定主机名称的IP地址
        InetAddress byName = InetAddress.getByName("DESKTOP-B94P8SK");
        //String getHostName() 获取次IP地址的主机名
        String hostName = byName.getHostName();
        System.out.println(hostName);
        //String getHostAddress()  返回文本显示中的IP地址字符串
        String Ip = byName.getHostAddress();
        System.out.println(Ip);
    }
}

协议

计算机中连接和通讯的规则被称之为网络通讯协议

UDP

  • 面向无连接
  • 速度块,大小限制64K,数据不安全,容易丢失

发送端步骤

  1. 创建发送端的DatagramSocket对象
  2. 创建数据,并把数据打包(DatagramPacket)
  3. 调用DatagramSocket对象的方法发送数据
  4. 释放资源
public class ClientDemo {
    public static void main(String[] args) throws Exception {
        DatagramSocket ds = new DatagramSocket();
        String s = "你好呀!";
        byte[] bytes = s.getBytes(StandardCharsets.UTF_8);
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port = 10000;
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
        
        ds.send(dp);
        ds.close();

    }
}

发送端步骤:

  1. 创建接受端的对象DatagramSocket对象
  2. 创建接受数据对象
  3. 调用DatagramSocket的方法接受数据并将数据放入箱子中
  4. 解析数据包,并把数据再控制台显示
  5. 释放资源
public class ReceiveDemo {
    
    public static void main(String[] args)throws Exception{
        DatagramSocket ds = new DatagramSocket(10000);
        byte[] b = new byte[1024];
        DatagramPacket dp = new DatagramPacket(b,b.length);
        ds.receive(dp);
        byte[] data = dp.getData();
        int length = dp.getLength();
        System.out.println(new String(data,0,length));
        ds.close();
    }
}

UDP的三种通讯方式
  • 单播,上面演示的就是单单播,一对一传输
  • 组播(IPv4)
public class ClientDemo {
    
    public static void main(String[] args) throws Exception {
        DatagramSocket ds = new DatagramSocket();
        String s = "你好呀吗!";
        byte[] bytes = s.getBytes();
        //组播地址
        InetAddress address = InetAddress.getByName("224.0.1.0");
        int port = 10000;
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
        ds.send(dp);
        ds.close();

    }
}
public class ReceiveDemo {
    
    public static void main(String[] args)throws Exception{
        //创建加入组播的对象
        MulticastSocket ms = new MulticastSocket(10000);
        byte[] bytes = new byte[1023];
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
        //把当前计算机绑定一个组播地址,表示添加到这一组中
        ms.joinGroup(InetAddress.getByName("224.0.1.0"));
        ms.receive(dp);
        int length = dp.getLength();
        System.out.println(new String(bytes,0,length));
        ms.close();
    }
}

  • 广播—广播地址为:255.255.255.255

书写方式根单播一摸一样,把地址改一下就行

TCP

  • 面向连接通讯

  • 速度慢,没有大小限制,数据安全

  • TCP通讯协议是一种可靠的网络协议,它再通讯的两端创建一个Socket对象,通讯之前保证连接已经建立

发送端步骤:

  1. 创建客户端的Socket对象与指定服务器端连接
  2. 获取输出流写数据
  3. 释放资源
public class ClientDemo1 {
    public static void main(String[] args)throws Exception{
        //1. 创建一个Socket对象
        Socket socket = new Socket("127.0.0.1",10000);
        //2. 获取一个IO流开始写数据
        OutputStream os = socket.getOutputStream();
        os.write("你好".getBytes());
        //3. 释放资源
        os.close();
        socket.close();
    }
}

接收数据的步骤

  1. 创建服务器的Socket对象
  2. 监听客户端连接,返回一个Socket对象
  3. 获取输入流对象,读数据,并把数据显示再控制台
public class ServerDemo1 {
    public static void main(String[] args) throws Exception{
        //1 创建Socket对象
        ServerSocket ss = new ServerSocket(10011);
        //2. 等待客户端连接
        Socket accept = ss.accept();
        //3. 获取输入流对象
        InputStream is = accept.getInputStream();
        int len;
        while ((len = is.read())!=-1){
            System.out.print((char)len);
        }
        //4. 释放资源
        is.close();
        ss.close();
    }
}

三次握手
  1. 客户端向服务端发出连接请求,等待确认
  2. 服务器向客户端返回一个响应 ,告诉客户端接收到了请求
  3. 客户端向服务器再次发出确认消息,连接建立
四次挥手
  1. 向客户端发出取消连接的请求
  2. 服务器向客户端返回一个响应,表示收到客户端取消请求
  3. 服务器将最后的数据处理完毕,服务器再向客户端发出确认取消消息
  4. 客户端再次发送确认消息,连接取消

练习

  • 客户端: 发送数据,接受服务器反馈
  • 服务器: 接受数据,给出反馈
public class ClientDemo1 {
    public static void main(String[] args)throws Exception{
        Socket socket = new Socket("127.0.0.1",11000);
        OutputStream os = socket.getOutputStream();
        os.write("hello".getBytes());
        //仅仅关闭输出流,并写一个结束标记,对socket没有任何影响
        socket.shutdownOutput();
//        InputStream is = socket.getInputStream();
//        int b;
//        while ((b = is.read()) != -1) {
//            System.out.println((char) b);
//        }
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
        br.close();
        os.close();
        socket.close();
    }
}


public class ServerDemo1 {
    public static void main(String[] args)throws Exception{
        ServerSocket ss = new ServerSocket(11000);
        Socket accept = ss.accept();
        InputStream is = accept.getInputStream();
        int b;
        while ((b = is.read()) != -1) {
            System.out.println((char) b);
        }
//        OutputStream os = accept.getOutputStream();
//        os.write("你是谁".getBytes());
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
        bw.write("拿来吧你!!!");

        bw.close();
        is.close();
        ss.close();
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5563727.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存