29 java网络编程

简介: TCP协议,三次握手,安全但是比较慢,适合传送大量数据

1 🚩TCP协议,三次握手,安全但是比较慢,适合传送大量数据


1.1 🏔️TCP编程用到的类


(1)InetAddress类


方法

说明

getLocalHost

获取本机IneAddress对象

getByName

根据制定主机名/域名获取IP地址

getHostName

获取IneAddress对象的主机名

getHostAddress

获取InetAddress对象地址


(2)Socket(插座)


使用步骤

服务端:

①创建 ServerSocket对象,指定端口

②ServersSocket的accept方法会返回一个Socket对象;【在服务器端获得插座】

③Socket对象提供了getOutputStream()方法和getInputStream()方法会返回字符流

客户端:

①创建Socket对象,指定服务器ip地址和端口

②通过Socket提供的方法,获得IO流进行相关操作

【注意: 发送完一次数据需要用,Socket提供的shutdownOutput()方法告诉对象已经发送完毕,最后要关闭Socket和IO流】


🌰server端代码示例:


public class serverDemo {
    public static void main(String[] args) throws IOException {
//        创建ServerSocket对象
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务器端口9999等待连接。。。");
//        获取Socket对象
        Socket socket = serverSocket.accept();
        InputStream inputStream  = socket.getInputStream();
        byte [] buffer = new byte[1024];
        int leng = 0;
        while ((leng = inputStream.read(buffer)) != -1){
            System.out.print(new String(buffer,0,leng));
        }
        System.out.println();
        //        回应数据
        OutputStream outputStream = socket.getOutputStream();
        byte  [] bufferser = "你好client".getBytes();
        outputStream.write(bufferser);
        socket.shutdownOutput();
        System.out.println("server回应完毕");
        socket.close();
        inputStream.close();
        outputStream.close();
    }
}


🌰client端代码示例:


public class ClientDemo {
    public static void main(String[] args) throws IOException {
//        创建Socket对象,连接服务器
        Socket socket = new Socket("127.0.0.1",9999);
        OutputStream outputStream = socket.getOutputStream();
        byte  [] buffer = "你好server".getBytes();
//        发送数据
        outputStream.write(buffer);
//        告诉对方发送完毕,否则会阻塞
        socket.shutdownOutput();
        System.out.println("client 第一次发送完毕");
//        获取回应
        InputStream inputStream  = socket.getInputStream();
        byte [] bufferclient = new byte[1024];
        int leng = 0;
        while ((leng = inputStream.read(bufferclient)) != -1){
            System.out.print(new String(bufferclient,0,leng));
        }
        System.out.println();
        socket.close();
        inputStream.close();
        outputStream.close();
        System.out.println("收到!退出");
    }
}


2 🚩UDP协议,可能数据丢失,适合小数据


🏔️DatagramSocket类和DatagramPacket类实现了UDP协议;


UDP编程没有明确的服务端和客户端;


🌰send端代码示例


public class SendDemo {
    public static void main(String[] args) throws IOException {
//        创建DatagramSocket对象,用于接收发送,端口9988用于接收
        DatagramSocket datagramSocket = new DatagramSocket(9988);
        byte [] sendBuffer = new byte[1024];
        sendBuffer = "四大名著是啥1?".getBytes();
//        打包数据
        DatagramPacket sendpacket = new DatagramPacket(sendBuffer, sendBuffer.length, InetAddress.getByName("127.0.0.1"), 9999);
        datagramSocket.send(sendpacket);
        System.out.println("提问完毕!");
//        接收回答
        byte [] daan = new byte[1024];
        DatagramPacket danpacket = new DatagramPacket(daan, daan.length);
        datagramSocket.receive(danpacket);
//        拆包
        int daleng = danpacket.getLength();
        byte [] danfu = danpacket.getData();
        System.out.println("回答:"+new String(danfu,0,daleng));
        datagramSocket.close();
        System.out.println("send端对话结束");
    }
}


🌰receive端代码示例:


public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
//        创建DatagramSocket对象,用于发送接受,9999端口等待接收
        DatagramSocket datagramSocket = new DatagramSocket(9999);
//        接收数据
        byte [] reciveBuffer = new byte[1024];
        DatagramPacket recdatagramPacket = new DatagramPacket(reciveBuffer,reciveBuffer.length);
        datagramSocket.receive(recdatagramPacket);
//        拆包
        int leng = recdatagramPacket.getLength();
        byte huixin [] = recdatagramPacket.getData();
        String str = new String(huixin,0,leng);
        if ("四大名著是啥?".equals(str)){
            byte h1 [] = "三国、水浒、红楼、西游".getBytes();
            DatagramPacket packet = new DatagramPacket(h1, h1.length, InetAddress.getByName("127.0.0.1"), 9988);
            datagramSocket.send(packet);
        }else {
            byte h1 [] = "what?".getBytes();
            DatagramPacket packet = new DatagramPacket(h1, h1.length, InetAddress.getByName("127.0.0.1"), 9988);
            datagramSocket.send(packet);
        }
        datagramSocket.close();
        System.out.println("receive端结束对话!");
    }
}


目录
相关文章
|
5天前
|
Java
java网络编程 UDP通信协议实现局域网内文件的发送和接收
java网络编程 UDP通信协议实现局域网内文件的发送和接收
java网络编程 UDP通信协议实现局域网内文件的发送和接收
|
11天前
|
网络协议 Java 关系型数据库
16 Java网络编程(计算机网络+网络模型OSI/TCP/IP+通信协议等)
16 Java网络编程(计算机网络+网络模型OSI/TCP/IP+通信协议等)
41 2
|
19天前
|
缓存 网络协议 算法
(二)Java网络编程之爆肝HTTP、HTTPS、TLS协议及对称与非对称加密原理!
作为一名程序员,尤其是Java程序员,那必须得了解并掌握HTTP/HTTPS相关知识。因为在如今计算机网络通信中,HTTP协议的作用功不可没,无论是日常上网追剧、冲���、亦或是接口开发、调用等,必然存在HTTP的“影子”在内。尤其对于WEB开发者而言,HTTP几乎是每天会打交道的东西。
45 10
|
18天前
|
Java 应用服务中间件 Linux
(九)Java网络编程无冕之王-这回把大名鼎鼎的Netty框架一网打尽!
现如今的开发环境中,分布式/微服务架构大行其道,而分布式/微服务的根基在于网络编程,而Netty恰恰是Java网络编程领域的无冕之王。Netty这个框架相信大家定然听说过,其在Java网络编程中的地位,好比JavaEE中的Spring。
|
19天前
|
安全 Java Linux
(七)Java网络编程-IO模型篇之从BIO、NIO、AIO到内核select、epoll剖析!
IO(Input/Output)方面的基本知识,相信大家都不陌生,毕竟这也是在学习编程基础时就已经接触过的内容,但最初的IO教学大多数是停留在最基本的BIO,而并未对于NIO、AIO、多路复用等的高级内容进行详细讲述,但这些却是大部分高性能技术的底层核心,因此本文则准备围绕着IO知识进行展开。
|
19天前
|
存储 Java Unix
(八)Java网络编程之IO模型篇-内核Select、Poll、Epoll多路复用函数源码深度历险!
select/poll、epoll这些词汇相信诸位都不陌生,因为在Redis/Nginx/Netty等一些高性能技术栈的底层原理中,大家应该都见过它们的身影,接下来重点讲解这块内容。
|
20天前
|
网络协议 Java 数据处理
(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述
就目前而言,多数网络编程的系列的文章都在围绕着计算机网络体系进行阐述,但其中太多理论概念,对于大部分开发者而言,用途甚微。因此,在本系列中则会以实际开发者的工作为核心,从Java程序员的角度出发,详细解读Java的网络编程核心内容。
|
1月前
|
网络协议 安全 Java
Java中的网络编程:Socket编程详解
Java中的网络编程:Socket编程详解
|
29天前
|
网络协议 Java Linux
|
1月前
|
安全 Java 网络安全
Java网络编程:高级应用与安全性探讨
Java网络编程:高级应用与安全性探讨