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 |(十四)网络编程 -> 正文阅读

[Java知识库]java |(十四)网络编程

概述

在这里插入图片描述
TCP、UDP

TCP(Transmission Control Protocel)传输控制协议
传输协议面向连接,传输数据最为安全,确保数据一定会发送到目标位置,但是速度慢

UDP(User Datagram Protocol)用户数据报协议
面向断开式的通信协议,不确保数据发送到位置,但速度快

java.net组件包

java.net.URL 统一资源定位符
java.net.IntetAddress 互联网IP地址
java.net.Socket 客户端套接字
java.net.ServerSocket 服务器端套接字
java.net.DatagramPacket 数据报包
java.net.DatagramSocket 数据报包套接字

URL
URL类代表一个统一资源定位符,指向互联网”资源“的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,如对数据库或搜索引擎的查询、更改等操作。
在这里插入图片描述
常用创建方法
public URL(String spec)
public URL(String protocol,String host,String file)
public URL(String protocol,String host,int port,String file)
public URL(URL context,String spec)

IP地址
InetAddress和SocketAddress、

此类表示互联网协议(IP)地址,IP地址是IP使用的32位或128位无符号数字,它是一种低级协议,UDP和TCP协议都是在他的基础上构建的
在这里插入图片描述

package day23Test.xzit.ipaddress;

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;

public class ipAddressTest {
    public static void main(String[] args) {
        try {
            InetAddress add0 = InetAddress.getLocalHost();//获取本机ip地址实例
            System.out.println(add0.getHostName());//获取本机服务器名称  LAPTOP-55GQ895M
            System.out.println(add0.getHostAddress());//获取本机ip地址  192.168.43.78


            //注意:需要联网
            InetAddress baiduIp = InetAddress.getByName("www.baidu.com");
            System.out.println(baiduIp.getHostName());//www.baidu.com
            System.out.println(baiduIp.getHostAddress());//183.232.231.172

        } catch (UnknownHostException e) {
            e.printStackTrace();
        }

        InetSocketAddress isa = new InetSocketAddress("localhost",9090);//创建基于给定端口号的套接字ip地址
        System.out.println(isa.getHostName());//localhost
        System.out.println(isa.getPort());//9090
        System.out.println(isa.getAddress());//localhost/127.0.0.1
    }
}

Socket

Socket类实现客户端套接字(简称套接字),套接字是两台机器间通信的端点。
java基于互联网的C/S模式的客户端程序主要依赖此类实现与服务器端的通信,它是java网络编程的核心组件。
socket组件实例通常必须绑定Ip地址(客户机网络域名)和一个未被在本机机器占用的端口号。
创建
public Socket()
public Socket(InetAddress address,int port)创建指定ip地址和端口号的套接字
public Socket(InetAddress address,int port,InetAddress localAddr,int localPort)创建连接到远处服务器的套接字
public Socket(String host,int port)接到指定主机的指定端口号
常用方法
void bind(SocketAddress bindpoint)
void close()关闭套接字
void connect(SocketAddress endpoint)将此套接字连接到服务器
void connect(SocketAddress endpoint,int timeout)套接字连接服务器,指定超时时间
InputStream getInputStream()返回此套接字的输入流
OutputStream getOutStream()返回此套接字的输出流

ServerSocket

ServerSocket类实现服务器套接字,服务器套接字等待请求通过网络传入,它基于该请求执行某些操作,然后可能像请求者返回结果
创建
public ServerSocket()无参构造器,创建非绑定服务器套接字
public ServerSocket(int port)创建一个绑定到特定端口的服务器套接字
public ServerSocket(int port,int backlog)指定端口号和队列长度
public ServerSocket(int port,int backlog,InetAddress bindAddr)指定端口号队列长度及指定主机地址创建套接字
常用方法
public Socket accept() throw IOException倾听并接受到此套接字的连接,未连接时处于阻塞状态
void close()关闭套接字
void SetSoTimeout(int timeout)以毫秒为单位设置超时时间,如果为0则永不超时
public boolean isBound()测试ServerSocket是否绑定
public boolean isClose()测试是否关闭
public InetAddress getInetAddress()返回此服务器套接字的本地地址
整合:分别建立客户端和服务器,连接并传输数据
客户端:

package day23Test.xzit.socket;

import java.io.*;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;

public class SocketTest {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);


        Socket client = new Socket();
        InetSocketAddress address = new InetSocketAddress("localhost",9900);
        try {
            client.bind(address);//将套接字绑定到某个接口及端口号
            System.out.println(client.isBound());//查看套接字有没有绑定  true
            System.out.println(client.isConnected());//判断是否是连接的 false

            InputStream in = null;
            OutputStream out = null;
            DataInput din = null;
            DataOutput dout = null;
            //远处IP地址及端口号
            InetSocketAddress removeAddr = new InetSocketAddress("localhost",997);

            if(!client.isConnected()){
                try {
                    //如果套接字没有连接
                    client.connect(removeAddr);//连接
                    in = client.getInputStream();//基于套接字获取输入流
                    out = client.getOutputStream();//基于套接字获取输出流
                    din = new DataInputStream(in);//基于in创建数据输入流
                    dout = new DataOutputStream(out);//基于out创建数据输出流

                    while (true){
                        System.out.println("请输入要输入的信息");
                        String msg = scan.next();
                        dout.writeUTF(msg);
                        String receiveMes = din.readUTF();
                        System.out.println("服务器返回信息是:" + receiveMes);

                    }

                    //在不需要套接字实例时,通常需要关闭套接字(首先关闭基于套接字建立的输入和输出流)

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

服务器

package day23Test.xzit.socket;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerSocketTest {
    public static void main(String[] args) {
        ServerSocket server = null;
        Socket client = null;
        InputStream in = null;
        OutputStream out = null;
        DataInput din = null;
        DataOutput dout = null;
        try {
            server = new ServerSocket(997);
            while (true){
                //等待客户端套接字继续连接
                //连接成功后返回连接的客户端套接字实例
                System.out.println("等待连接");
                client = server.accept();
                System.out.println("连接成功");
                //建立输入输出流
                in = client.getInputStream();
                din = new DataInputStream(in);
                out = client.getOutputStream();
                dout = new DataOutputStream(out);
                while(true){//重复接收及发送信息
                    String receiveMsg = din.readUTF();//从客户端接收数据
                    dout.writeUTF("你是什么东西," + receiveMsg + "?");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

结果:(先运行服务器,再运行客户端)
1、先运行服务器,此时服务器等待连接
在这里插入图片描述
2、然后运行客户端,客户端连接服务器,并让客户输入信息,这里输入了“我的信息”
在这里插入图片描述
3、服务器连接成功,并将信息发送给客户端
在这里插入图片描述
4、客户端循环发信息给服务器

在这里插入图片描述

DatagramPacket

DatagramPacket类表示用户数据报包,数据报包用来实现无连接包投递服务。数据报包中可以包含各种数据类型的对象;
每条报文只根据该包中包含的信息(通常是url和端口号)从一台机器路由到另一台机器;
从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达,不对包投递做出保证

创建(常用)
public DatagramPacket(byte[] buf,int len)构建用来接收长度为len的数据包,len必须小于等于buf长度
public DatagramPacket(byte[] buf,int len,SocketAddress addr)构建用来接收长度为len的数据包,指定发送目的地址
public DatagramPacket(byte[] buf,int len,InetAddress addr,int port)构建用来接收长度为len的数据包,指定用来发送目的地址和端口号
常用方法
void setData(byte[] buf)设置数据缓冲区
void setSocketAddress(SocketAddress addr)
void setSocketAddress(SocketAddress addr,int port)
void setLength(int length)设置数据包缓冲区长度
byte[] getData()获取数据包缓冲区
int getLength()返回将要发送或接受到的数据的长度

DatagramSocket

DatagramSocket类表示用来发送或接收数据报包的套接字。数据包套接字是包投递服务的发送或接收点。每个数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达

构建(常用)
public DatagramSocket()构建数据报套接字并将其绑定到主机上任何可用的端口
public DatagramSocket(int port)绑定到指定端口
public DatagramSocket(int port,InetAddress addr)绑定到指定端口和指定本地地址
public DatagramSocket(int port,SocketAddress addr)创建数据报套接字并将其绑定到指定的本地套接字地址
常用方法
void bind(SocketAddress addr)绑定一个IP地址
void connect(SocketAddress addr)发送
void disconnect()断开(非关闭)
void recive(DatagramPacket p)接收数据包
void send(DatagramPacket p)发送数据包
void close()关闭数据包套接字

整合
客户端:

package day23Test.xzit.socket;

import java.io.IOException;
import java.net.*;

public class DatagramPacketTest {
    public static void main(String[] args) {
        byte[] bys = new String("天天爱学习").getBytes();
        DatagramPacket dp = new DatagramPacket(bys,bys.length);

        byte[] bys2 = new byte[60];//接收用户返回的数据包缓冲区
        DatagramPacket dp2 = new DatagramPacket(bys2,bys2.length);

        SocketAddress addr = new InetSocketAddress("localhost",1254);//远程地址
        try {
            //创建一个发送和接收数据报包的套接字绑定到本地8921端口
            DatagramSocket ds = new DatagramSocket(8921);
            ds.connect(addr); //连接远程地址服务器
//            System.out.println("是否已经连接:" + ds.isConnected());
//            ds.disconnect();//断开套接字连接
//            System.out.println("是否已经连接:" + ds.isConnected());

            System.out.println("开始发送数据");
            ds.send(dp);//向目的地发送数据报包
            ds.receive(dp2);//接收数据报包
            //获取数据包中的数据
            bys2 = dp2.getData();
            System.out.println("返回的数据报包数据是:" + new String(bys2));

        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}

服务器:

package day23Test.xzit.socket;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class DatagramServerTest {
    public static void main(String[] args) {
        byte[] bys = new byte[18];
        DatagramPacket dp = new DatagramPacket(bys,bys.length);
        try {
            DatagramSocket ds = new DatagramSocket(1254);
            System.out.println("准备接收数据报包:");
            ds.receive(dp);//接收用户发送的数据报包
            System.out.println("客户端发送的数据是:" + new String(dp.getData()));
            //发送数据给客户端
            byte[] bys2 = new String("给客户端买糖吃").getBytes();
            DatagramPacket dp2 = new DatagramPacket(bys2,bys2.length);

            //建立发送的数据报包
            dp2.setAddress(InetAddress.getByName("localhost"));//绑定地址
            dp2.setPort(8921);//绑定端口号
            ds.send(dp2);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

结果:
请添加图片描述
请添加图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-08 11:07:41  更:2021-08-08 11:10:40 
 
开发: 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/10 16:10:49-

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