IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> java网络编程 -> 正文阅读

[网络协议]java网络编程

1、 TCP协议 :传输控制协议

  1. 使用tcp协议前,需先建立TCP连接,形成传输数据通道,
  2. 传输前,采用三次握手方式,是可靠的
  3. TCP协议进行通信的两个应用进程:客户端、服务端
  4. 在连接中,课进行大量数据的传输
  5. 传输完毕,需释放已建立的连接,效率低

一下为一个简单的聊天程序:

1.1 字节流传输

服务端

public class TcpServerDemo {

    public static void main(String[] args) throws IOException, IOException {

        // 1.监听端口号
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务器启动!等待连接...");
        //2.当没有客户端连接9999端口时,程序会阻塞,等待连接;如果有客户端连接,则会返回Socket对象,程序继续
        Socket clientSocket = serverSocket.accept();
        System.out.println("服务端连接:" + clientSocket.getClass().getName());

        // 3. 获取输入流,接收到客户端发送的消息
        InputStream inputStream = clientSocket.getInputStream();
        //读取流中的数据
        int i;
        StringBuilder stringBuilder = new StringBuilder();
        System.out.print("客户端发来的消息:");
        while ((i = inputStream.read()) != -1) {
            stringBuilder.append((char) i);
        }
        System.out.print(stringBuilder);

        // 4. 获取对应客户端的输出流,向客户端发送消息
        OutputStream outputStream = clientSocket.getOutputStream();
        outputStream.write((stringBuilder + "(服务器消息)").getBytes());
        clientSocket.shutdownOutput();  //输出写入结束标志,很重要! 否则会阻塞


        //关闭操作
        outputStream.close();
        serverSocket.close();
        inputStream.close();

    }
}

客户端

public class TcpClientDemo {


    public static void main(String[] args) throws IOException {

        // 1. 连接服务端(ip,端口),因为此时是在本机上,所以是本机ip
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("客户端连接:" + socket.getClass().getName());

        // 2. 用输出流向服务端发送数据,发送的hello
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello".getBytes());
        socket.shutdownOutput();  //输出写入结束标志,很重要! 否则会阻塞


        // 3. 获取输入流,得到服务端发送的数据
        InputStream inputStream = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int redLin = 0;
        while ((redLin = inputStream.read(bytes)) != -1) {
            System.out.println("服务器发来的消息:" + new String(bytes, 0, redLin));
        }

        //关闭
        outputStream.close();
        socket.close();
        System.out.println("客户端退出");
    }

}

1. 2 字符流传输

如果客户端使用字符流传输,那么服务端要使用字符流读取
服务端代码:

public class TcpServerDemo {

    public static void main(String[] args) throws IOException, IOException {

        // 1.监听端口号
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务器启动!等待连接...");
        //2.当没有客户端连接9999端口时,程序会阻塞,等待连接;如果有客户端连接,则会返回Socket对象,程序继续
        Socket clientSocket = serverSocket.accept();
        System.out.println("服务端连接:" + clientSocket.getClass().getName());

        // 3. 获取输入流,接收到客户端发送的消息
        InputStream inputStream = clientSocket.getInputStream();
//        int read = inputStream.read();  //因为客户端使用的是字符流发送,所以字节流读取不到
        
        //转为字符流读取
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String str = bufferedReader.readLine();
        System.out.println(str);


        // 4. 获取对应客户端的输出流,向客户端发送消息
        OutputStream outputStream = clientSocket.getOutputStream();
        // 转为字符流输出
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));

        bufferedWriter.write((str + "字符流,(服务器消息)"));
        bufferedWriter.newLine();  // 如果用字符输出流,这个表示结束输出标志
        bufferedWriter.flush(); //要刷新(关闭操作也可以写进去),否则写不进去

        //关闭操作
        bufferedWriter.close();
        outputStream.close();
        serverSocket.close();
        inputStream.close();

    }
}

客户端

public class TcpClientDemo {

    public static void main(String[] args) throws IOException {

        // 1. 连接服务端(ip,端口),因为此时是在本机上,所以是本机ip
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("客户端连接:" + socket.getClass().getName());

        // 2. 用输出流向服务端发送数据,发送的hello
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello");// 如果用字符输出流,这个表示结束输出标志
        bufferedWriter.newLine(); //  字符流的输出结束标志
        bufferedWriter.flush();  //要刷新(关闭操作也可以写进去),否则写不进去


        // 3. 获取输入流,得到服务端发送的数据
        InputStream inputStream = socket.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

        System.out.println(bufferedReader.readLine());

        //关闭

        bufferedReader.close();
        outputStream.close();
        socket.close();
        System.out.println("客户端退出");
    }

}

2、UDP

  1. 将数据封装成数据包,不建立连接
  2. 每个数据包的大小为64kb,不适合大量数据
  3. 因无需连接,所以是不可靠的
  4. 发送数据结束时不需要释放资源(因为不是面向连接的),速度快
  5. 例如:发短信
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-26 12:23:00  更:2021-07-26 12:24:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/2 8:03:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码