一.首先是网络编程的三要素:IP地址,端口号,通信协议

1.IP地址:通过docs命令:ipconfig

java tcp 与硬件通信 tcp/ip java_java


可以通过ping ip命令查看当前ip是否通畅:

java tcp 与硬件通信 tcp/ip java_udp_02


2. 端口号:正在运行的程序标识。有效端口:0-65535,其中0~1024系统使用或保留端口,所以端口尽量要用1024以上的,可以使用netstat -ano命令查看所有运行程序的端口。太长了这里截取一部分

java tcp 与硬件通信 tcp/ip java_udp_03


3.通信协议:
常见的有两种协议:
TCP和UDP协议
UDP:
将数据源和目的地封装到数据包中,不需要建立连接。
每个数据包的大小限制在64K。
因为不建立连接,所以安全性差,速度快。
TCP:
建立连接形成传输数据的通道,然后再传输数据,通过三次握手。
安全性高,效率低。

二.具体实现步骤

1.UDP协议方式:
UDPSend.java

package ch.hp.udp;

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

/**
 * socket 网络编程之UDP协议 发送方
 */
public class UDPSend {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket();//创建DatagramSocket对象
        String data = "UDP......";//要发送的数据
        InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
        DatagramPacket packet = new DatagramPacket(data.getBytes(),0,data.length(),inetAddress,9999);
        socket.send(packet);//发送
        socket.close();//关闭

    }
}

UDPReceive.java

package ch.hp.udp;

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

/**
 * socket 网络编程之UDP协议 接收方
 */
public class UDPReceive {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(9999);
        //创建数据包对象 ,用于接收发送方发送的字节数组的数据
        DatagramPacket packet = new DatagramPacket(new byte[4096],4096);

        socket.receive(packet);//接收数据

        byte[] data = packet.getData();//取出接收数据的内容
        int length = data.length;//取出数据的长度
        String result = new String(data,0,length);

        System.out.println(result);//打印接收的数据
        socket.close();

    }
}

结果:

java tcp 与硬件通信 tcp/ip java_udp_04

2.TCP协议方式:

ServerDemo.java

package ch.hp.tcp;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * socket 网络编程之TCP协议 服务端
 */
public class ServerDemo {

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(7777);
        Socket socket = serverSocket.accept();//调用accept拿到一个socket对象

        //拿到输入输出流
        InputStream is = socket.getInputStream();
        OutputStream os = socket.getOutputStream();

        os.write("我是服务端响应道客户端的数据".getBytes());

        //读取客户端发送的请求参数
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        //将读取的数据打印出来
        String result = new String(bytes,0,len);
        System.out.println(result);

    }
}

ClientDemo.java

package ch.hp.tcp;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

/**
 * socket 网络编程之TCP协议 客户端
 */
public class ClientDemo {

    public static void main(String[] args) throws IOException {
        //创建Socket对象,传入主机ip和端口
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),7777);
        //输入流,用于读取服务端的数据
        InputStream is = socket.getInputStream();
        //输出流,用于向服务端写数据
        OutputStream os = socket.getOutputStream();

        //读取服务端的数据
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        //将读取的数据打印出来
        String result = new String(bytes,0,len);
        System.out.println(result);
        //向服务端写数据
        os.write("我是客户端写入服务端的数据".getBytes());
        socket.close();

    }
}

TCP协议方式,注意需要先运行服务端;结果

java tcp 与硬件通信 tcp/ip java_java tcp 与硬件通信_05

java tcp 与硬件通信 tcp/ip java_java_06