网络编程——Java

网络编程——Java,第1张

网络编程——Java

网络编程

网络编程要素IP

InetAddress的使用 端口协议UDP通信程序

单播组播广播 TCP通信程序

网络编程要素
常用
Socket
ServerSocket

DatagramSocket
DatagramPacket

IP地址

设备在网络中的标识,是唯一的标识。

端口号

应用程序在设备中 的标识

协议

数据在网络中传输的规则,常见的协议有:UDP和TCP。

在网络通信中,不同计算机运行的程序,可以进行数据的传输。

IP InetAddress的使用

为了方便对IP地址的获取和 *** 作,Java提供了一个类InetAddress供我们使用。

InetAddress: 此类表示Internet协议(IP协议)

static InetAddress getByName(String host)
确定主机名称的IP地址,主机名称可以是机器名称,也可以是IP地址。
String getHostName() 获取此IP地址的主机名。
String getHostAddress() 返回文本显示中的IP地址字符串
private static void demo01() throws UnknownHostException {
    InetAddress address = InetAddress.getByName("192.168.0.106");
    String hostName = address.getHostName();
    String hostAddress = address.getHostAddress();
    System.out.println("主机名:" + hostName);
    System.out.println("IP为:" + hostAddress);
}
端口

应用程序在设备中唯一的标识。

端口号范围:0-65536

0-1023用于知名的网络服务。我们使用1024以上的端口就可。

一个端口号只能供一个应用程序使用。

协议

UDP:面向无连接,容易丢失,速度快,数据不安全。

TCP:面向连接。

UDP通信程序
1. 创建一个socket
DatagramSocket socket = new DatagramSocket();
//发送端可以直接创建一个socket,但是接收端的socket要指定用来接收的端口号,
DatagramSocket socket = new DatagramSocket(10000);
2. 创建包裹
DatagramPacket packet = new DatagramPacket(byte[],length,address,port);
这里的参数要进行填写,如果是发送端的话
    第一个参数是:发送数据
    第二个参数是:数据长度
    第三个参数是:服务器地址,通过InetAddress.getByName(Ip或计算机名获取。)
    第四个参数是:服务器接收数据的端口号。
3. 接收或发送
    send / receive
4. 服务端获取包裹数据
    packet.getData();
   数据长度:
    packet.getLength();

单播
    private static void demo03() throws IOException {
//        client
        DatagramSocket socket = new DatagramSocket();
        String data = "hello world";
        InetAddress address = InetAddress.getByName("192.168.137.7");
        byte[] messgae = data.getBytes();
        DatagramPacket packet = new DatagramPacket(messgae, messgae.length, address, 10000);
        socket.send(packet);
        socket.close();
    }
private static void demo02() throws IOException {
    //server
    DatagramSocket socket = new DatagramSocket(10000);
    byte[] bytes = new byte[1024];
    DatagramPacket packet = new DatagramPacket(bytes, 1024);
    socket.receive(packet);
    byte[] data = packet.getData();
    System.out.println(new String(data));
}
组播

通过加入一个组,信息发向一个组。

组播地址:224.0.1.0

组播的服务端,要加入一个组中。并且不再使用DatagramSocket,而是使用MulticastSocket
//服务端要首先声明端口号。
MulticastSocket socket = new MulticastSocket(10000);
//提出声明,加入224.0.1.0组
socket.joinGroup(InetAddress.getByName("224.0.1.0"));
   private static void demo05() throws IOException {
//        组播的接收端
        MulticastSocket socket = new MulticastSocket(10000);
//        将该地址加入到组播地址224.0.1.0中
        socket.joinGroup(InetAddress.getByName("224.0.1.0"));
        DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
        socket.receive(packet);
        byte[] data = packet.getData();
        System.out.println(new String(data));
    }


    private static void demo04() throws IOException {
//        组播的发送端
        DatagramSocket socket = new DatagramSocket();
//        组播地址
        InetAddress address = InetAddress.getByName("224.0.1.0");
        String message = "你好,我是王小明";
        byte[] bytes = message.getBytes();
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, 10000);
        socket.send(packet);
        socket.close();
    }
广播

广播地址:255.255.255.255

也就是将数据发给能连接到的所有设备。

package day03;

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

public class Client {
    //    发送端
    public static void main(String[] args) throws IOException {
        // 广播
//        创建一个socket用来发送数据
        DatagramSocket socket = new DatagramSocket();
//        获取广播地址 address 255.255.255.255
        InetAddress address = InetAddress.getByName("255.255.255.255");
//        要发送的数据
        String data = "Hello world";
        byte[] message = data.getBytes();
//        打包数据,并发送
        DatagramPacket packet = new DatagramPacket(message, message.length, address, 10000);
        
        socket.send(packet);
        socket.close();
    }
}
package day03;

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

public class Server {
    
    public static void main(String[] args) throws IOException {
//        接收端
        DatagramSocket socket = new DatagramSocket(10000);
//        创建一个盒子用来接收数据,
        DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
//        开始接收
        socket.receive(packet);
//        获取盒子中的数据
        byte[] data = packet.getData();
//        打印数据
        System.out.println(new String(data));

    }
}
TCP通信程序
  private static void demo07() throws Exception {
//        TCP 服务端
        ServerSocket socket = new ServerSocket(10000);
      // 服务端使用ServerSocket,并且绑定端口,然后通过accpet来接收
        Socket accept = socket.accept();
//      返回一个Socket对象
        InputStream inputStream = accept.getInputStream();
//      通过该Socket对象获得一个输入流,读取数据、
        int i = 0;
        while ((i = inputStream.read()) != -1) {
            System.out.print((char) i);
        }
        inputStream.close();
        accept.close();
        socket.close();
    }

    private static void demo06() throws IOException {
//        TCP连接,客户端
        // 客户端确认要进行通信的地址和端口,获取字节输出流,写出数据
        Socket socket = new Socket("192.168.137.7", 10000);
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("what are you doing?".getBytes());
        outputStream.close();
        socket.close();
    }

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5709785.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存