Java网络编程

网络是什么?

网络就是计算机之间通过某种方式连接起来,可以进行通信,数据传输,资源共享的一种方式。

ip地址

ip地址就是计算机在网络中的唯一标识,通过ip地址可以找到对应的计算机。

ipv4与ipv6

ipv4是32位的IP地址,用点分十进制表示,例如:192.168.1.1

ipv6是128位的IP地址,用冒号分十六进制表示,例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334

端口

端口就是计算机上的一个软件程序,通过端口可以找到对应的软件程序,进行通信。

所以,ip地址和端口组合起来就是计算机上的一个软件程序。

域名

域名就是ip地址的别名,通过域名可以找到对应的ip地址,进行通信。

例如:www.baidu.com对应的ip地址是 [183.240.98.161]

网络协议

网络协议就是计算机之间通信的规则,用于规定数据的格式,传输方式等。

例如:TCP/IP协议,HTTP协议等。

TCP/IP协议

TCP/IP协议是互联网的基础协议,分为四层:应用层,传输层,网络层,数据链路层。

  • 应用层:负责应用程序之间的通信,例如:HTTP,FTP等。
  • 传输层:负责应用程序之间的数据传输,例如:TCP,UDP等。
  • 网络层:负责数据包的传输,例如:IP,ICMP等。
  • 数据链路层:负责数据包的传输,例如:ARP,RARP等。

TCP协议

TCP协议是一种可靠的,面向连接的协议,用于保证数据的完整性和顺序性。

  • 三次握手:建立连接的过程,需要三次握手,确保双方都准备好进行通信。
  • 四次挥手:断开连接的过程,需要四次挥手,确保双方都准备好断开连接。
  • 数据传输:通过TCP协议传输数据,数据会被分成多个数据包,进行传输。

UDP协议

UDP协议是一种不可靠,无连接的协议,用于快速传输数据。

  • 数据传输:通过UDP协议传输数据,数据不会被分成多个数据包,直接进行传输。

网络编程

InetAddress类的使用

InetAddress类是Java中用于表示IP地址的类,可以通过该类获取IP地址,主机名等信息。

获取IP地址

java 复制代码
InetAddress address = InetAddress.getByName("www.baidu.com");
String ip = address.getHostAddress();
System.out.println(ip);

获取主机名

java 复制代码
InetAddress address = InetAddress.getByName("www.baidu.com");
String hostName = address.getHostName();
System.out.println(hostName);

判断是否可达

java 复制代码
InetAddress address = InetAddress.getByName("www.baidu.com");
boolean reachable = address.isReachable(5000);
System.out.println(reachable);

获取本地主机

java 复制代码
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);

使用Socket类完成TCP通信

Socket是Java中用于网络通信的类,可以通过该类实现客户端和服务器之间的通信。

创建Socket

java 复制代码
Socket socket = new Socket("localhost", 8080);

发送数据

java 复制代码
OutputStream outputStream = socket.getOutputStream();
outputStream.write("Hello World".getBytes());

接收数据

java 复制代码
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int len = inputStream.read(buffer);
System.out.println(new String(buffer, 0, len));

关闭Socket

java 复制代码
socket.close();

示例一

java 复制代码
public class ServerTest {
    public static void main(String[] args) {

        try {
            // 监听6666端口
            ServerSocket serverSocket = new ServerSocket(6666);
            // 建立连接套接字
            Socket socket = serverSocket.accept();
            // 获取输入流
            InputStream inputStream = socket.getInputStream();

            int len = 0;
            byte[] bytes = new byte[1024];
            while((len = inputStream.read(bytes)) != -1) {
                System.out.println("叮咚,来自客户端的又一条信息:" + new String(bytes, 0, len));
            }

            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("娇女我轻扶琴 燕嬉我紫竹林".getBytes());
            //socket.shutdownOutput();


            inputStream.close();
            outputStream.close();
            socket.close();
            serverSocket.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
        }

    }
}


public class ClientTest {
    public static void main(String[] args) {

        try {
            Socket socket = new Socket(InetAddress.getLocalHost(),6666 );

            OutputStream outputStream = socket.getOutputStream();

            outputStream.write("今日我赢酒醉,醉把佳人成双对~".getBytes());
            InputStream inputStream = socket.getInputStream();
            // 设置结束标记
            socket.shutdownOutput();
            int len = 0;
            byte[] bytes = new byte[1024];
            while((len = inputStream.read(bytes)) != -1) {
                System.out.println("叮咚,来自服务器端的又一条信息:" + new String(bytes, 0, len));
            }

            outputStream.close();
            inputStream.close();
            socket.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
        }
    }
}

示例二

java 复制代码
public class ServerTest {
    public static void main(String[] args) {

        try {
            // 监听6666端口
            ServerSocket serverSocket = new ServerSocket(6666);
            // 建立连接套接字
            Socket socket = serverSocket.accept();
            // 获取输入流
            InputStream inputStream = socket.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

            String str = null;
            while((str = bufferedReader.readLine()) != null) {
                System.out.println("叮咚,来自客户端的又一条信息:" + str);
            }

            OutputStream outputStream = socket.getOutputStream();
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
            bufferedWriter.write("娇女我轻扶琴 燕嬉我紫竹林");
            bufferedWriter.newLine();
            bufferedWriter.flush();
            //socket.shutdownOutput();


            bufferedWriter.close();
            bufferedReader.close();
            socket.close();
            serverSocket.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
        }

    }
}

public class ClientTest {
    public static void main(String[] args) {

        try {
            Socket socket = new Socket(InetAddress.getLocalHost(),6666 );

            OutputStream outputStream = socket.getOutputStream();
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));

            bufferedWriter.write("今日我赢酒醉,醉把佳人成双对~");
            bufferedWriter.newLine();
            bufferedWriter.flush();

            InputStream inputStream = socket.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

            // 设置结束标记
            socket.shutdownOutput();
            String str = "";
            while((str = bufferedReader.readLine()) != null) {
                System.out.println("叮咚,来自服务器端的又一条信息:" + str);
            }

            bufferedReader.close();
            bufferedWriter.close();
            socket.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
        }
    }
}

netstat命令

netstat -an 查看端口监听和网络情况

netstat -anb 查看端口监听和网络情况,并显示占用端口的程序名称

netstat -anb | more 分页查看端口监听和网络情况,并显示占用端口的程序名称

使用DatagramSocket完成UDP通信

示例

java 复制代码
public class ServerTest {
    public static void main(String[] args) {
        try {
            // 创建UDP套接字
            DatagramSocket datagramSocket = new DatagramSocket(6666);

            byte[] bytes = new byte[1024];

            // 创建接收数据的数据包
            DatagramPacket datagramPacket = new DatagramPacket(bytes,1024);

            // 接收数据包
            datagramSocket.receive(datagramPacket);

            // 拆包
            int len = datagramPacket.getLength();
            byte[] data = datagramPacket.getData();

            System.out.println("叮咚,您有一条由客户端发送的信息:" + new String(data,0,len));

            data = "让我再靠近一点点 因为你太温暖 我会再变得坚强一点点 因为你太柔软".getBytes();

            // 创建发送的数据包
            datagramPacket = new DatagramPacket(data,data.length,InetAddress.getByName("127.0.0.1"),8888);

            // 发送数据包
            datagramSocket.send(datagramPacket);

            // 关闭套接字
            datagramSocket.close();
        } catch (SocketException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
        }


    }
}



public class ClientTest {
    public static void main(String[] args) {
        try {
            // 创建UDP套接字
            DatagramSocket datagramSocket = new DatagramSocket(8888);

            byte[] data = "城中楼阁 几经风霜".getBytes();

            // 创建发送数据包,指定发送目的套接字
            DatagramPacket datagramPacket = new DatagramPacket(data,data.length,
                    InetAddress.getByName("127.0.0.1"),6666);

            // 发送数据包
            datagramSocket.send(datagramPacket);

            // 接收数据包
            datagramSocket.receive(datagramPacket);

            // 拆包
            int len = datagramPacket.getLength();
            data = datagramPacket.getData();

            System.out.println("叮咚,收到来自服务器端的一条新的消息:" + new String(data,0,len));

            // 关闭套接字
            datagramSocket.close();
        } catch (SocketException e) {
            throw new RuntimeException(e);
        } catch (UnknownHostException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
        }
    }
}
相关推荐
乔冠宇7 分钟前
基于Cipher的Java加密工具类
java·开发语言
Y编程小白15 分钟前
解决运行npm时报错
开发语言·前端·npm
立秋678920 分钟前
使用Python Dotenv库管理环境变量
开发语言·数据库·python
WebGISer_白茶乌龙桃41 分钟前
Cesium ArcGisMapServerImageryProvider API 介绍
开发语言·javascript·ecmascript
乔冠宇1 小时前
Java中初步使用websocket(springBoot版本)
java·网络·websocket·网络协议
孙尚香蕉1 小时前
服务器上安装Nginx详细步骤
java·服务器·前端
bing_1581 小时前
Spring的设计理念之IOC
java·后端·spring
S-X-S1 小时前
Java实现.env文件读取敏感数据
java·开发语言·.env
我命由我123451 小时前
游戏开发领域 - 游戏引擎 UE 与 Unity
开发语言·c++·unity·c#·游戏引擎·unreal engine·unreal engine 4
深度混淆1 小时前
C#,入门教程(11)——枚举(Enum)的基础知识和高级应用
开发语言·算法·c#·枚举·enum