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 {
        }
    }
}
相关推荐
这周也會开心1 分钟前
云服务器安装JDK、Tomcat、MySQL
java·服务器·tomcat
hrrrrb1 小时前
【Spring Security】Spring Security 概念
java·数据库·spring
小信丶1 小时前
Spring 中解决 “Could not autowire. There is more than one bean of type“ 错误
java·spring
sdgsdgdsgc1 小时前
Next.js企业级应用开发:SSR、ISR与性能监控方案
开发语言·前端·javascript
周杰伦_Jay2 小时前
【Java虚拟机(JVM)全面解析】从原理到面试实战、JVM故障处理、类加载、内存区域、垃圾回收
java·jvm
像素之间3 小时前
HTTP之content-disposition
网络·网络协议·http
2501_915909064 小时前
tcpdump 抓包数据分析实战,命令、过滤、常见故障定位与真机补充流程
网络·测试工具·ios·小程序·uni-app·iphone·tcpdump
rit84324995 小时前
基于MATLAB的模糊图像复原
开发语言·matlab
fie88895 小时前
基于MATLAB的声呐图像特征提取与显示
开发语言·人工智能
程序员小凯5 小时前
Spring Boot测试框架详解
java·spring boot·后端