基于Java语言实现Socket通信的实例

基于Java语言实现Socket通信

由于近日项目需求,需要在服务器中增加Socket通信的功能,接收硬件设备发送的心跳包和相关数据,因此又重新对Java的网络编程进行了复习,根据项目的实际情况做了简化的编程,实现了简单的通信过程。

1. Socket通信原理

源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字。其用于标识客户端请求的服务器和服务。

以下是通过Socket套接字实现客户端与服务器端通信的示意图:

在实际应用中,客户端会通过访问服务器的IP和PORT连接到服务器端,这个过程在服务器和客户端之间创建一个Socket,然后通过I/O数据流实现数据传输,也就是Socket的通信过程。

2. 服务器端

服务器端模拟接收硬件设备传输的心跳包(一个长度为10的字节数组),服务器端会获取到心跳包以及硬件设备的地址和端口号。

public class Server extends Thread{
  //服务器端口号
  private int port;
  private ServerSocket server = null;
  public Server(){
    //创建一个服务器,同时可以接收10个设备发送的数据
    server = new ServerSocket(port,10);
    System.out.println("Socket服务器启动,开始接受数据");
  }
  @Override
  public void run(){
    while (true) {
      Socket socket = null;
      InputStream inputStream = null;
      OutputStream outputStream = null;
      byte[] inputData = new byte[1024];
      try {
        //接收Socket数据
        socket = server.accept();
        //获取远程采集机的IP和端口号
        String remoteAddress = socket.getInetAddress().toString();
        int remotePort = socket.getPort();
        inputStream = socket.getInputStream();
        //获取传入的数据长度
        int length = inputStream.read(inputData);
        //创建输出流向客户端返回信息
        outputStream = socket.getOutputStream();
        if (length == 10) {
          //如果长度等于10,说明传入的是心跳包
          System.out.println("接收到心跳包,客户端信息["+remoteAddress+":"+remotePort+"]");
          outputStream.write("success".getBytes());
        } else {
          System.out.println("接收的信息有误.");
          outputStream.write("failed".getBytes());
        }
      } catch (IOException e) {
        e.printStackTrace();
      } finally {
        try {
          if (inputStream != null) {
            inputStream.close();
          }
          if (outputStream != null) {
            outputStream.close();
          }
          if (socket != null) {
            socket.close();
          }
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
  }
  //省略Getter和Setter方法
}

3. 客户端

客户端负责每隔一段时间向服务器发送一个心跳包。

public final class Client {
  private String address = "";
  private int port = 0;
  private Socket socket = null;
  private Client() {
  }
  private Client(String address, int port) throws IOException {
    this.address = address;
    this.port = port;
    this.socket = new Socket(address, port);
  }
  public static byte[] sendCommand(String address, int port, byte[] data) {
    Client client = null;
    OutputStream outputStream = null;
    InputStream inputStream = null;
    byte[] recevie = new byte[40];
    try {
      client = new Client(address, port);
      outputStream = client.getSocket().getOutputStream();
      outputStream.write(data);
      System.out.print("Send Data Success");
      inputStream = client.getSocket().getInputStream();
      inputStream.read(recevie);
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        inputStream.close();
        outputStream.close();
        client.getSocket().close();
      } catch (IOException ioe) {
        System.out.print("IOE when closing resource");
      }
    }
    return recevie;
  }
  /**
   * 测试函数
   **/
  public static void test() {
    for (int i = 0; i < 10; i++) {
      //服务器地址和IP
      String address = "127.0.0.1";
      int port = 9000;
      //心跳包
      byte[] data = "#$*beat001".getBytes();
      String receive = new String(Client.sendCommand(address, port, data));
      System.err.println("第" + i + "次发送心跳包" + receive);
      try {
        //每隔2分钟发送一个心跳包
        Thread.sleep(2 * 60 * 1000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
  //省略Getter和Setter方法
}

4. 小结

目前的这种方式比较像目前共享单车的通信模式,通过心跳包来获取Client的IP和PORT,然后Server就可以通过心跳包上传的IP和PORT主动的向Client通信了。其他的物联网项目也可以使用这样的方式,这样就可以实现主动的与物联网设备的通信了,只需要规定好协议和传送数据了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • Java基于socket实现的客户端和服务端通信功能完整实例

    本文实例讲述了Java基于socket实现的客户端和服务端通信功能.分享给大家供大家参考,具体如下: 以下代码参考马士兵的聊天项目,先运行ChatServer.java实现端口监听,然后再运行ChatClient.java 客户端实例 ChatClient.java package socketDemo; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; public class Ch

  • java实现Socket通信之单线程服务

    前言 使用基于TCP 协议的双向通信时,网络中的两个应用程序之间必须首先建立一个连接,这两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口:HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力. Socket的英文原义是"孔"或

  • java实现基于Tcp的socket聊天程序

    对于步入编程行业不深的初学者或是已经有所领会的人来说,当学习一项新的技术的时候,非常渴望有一个附上注释完整的Demo.本人深有体会,网上的例子多到是很多,但是很杂不完整,写代码这种东西来不得半点马虎,要是错了一点,那也是运行不了的.这对于初学者来说更加的头疼,因为他根本不知道错在哪里,盲目的改只能错上加错.最后不得不去找找看看有没有能够直接运行的例子再加以模仿. 下面是博主在学习Java的socket时写的一个完整的例子,并且带上了完整的注释.它是一个简单的聊天程序,但是它可以设置任意多用户同时

  • java+jdbc+mysql+socket搭建局域网聊天室

    本文实现思路:利用UDP协议进行局域网信息传输,建立点对点的聊天网络,每个端用户有自己的一个mysql数据库,所以需要获取其数据库用户名和密码,然后通过该数据库内容发送信息,接收消息则没有限制, 步骤: 建立数据表存储主机ip,接收信息端口port,nickname 向所有用户发送信息 接收信息 小部件(添加好友,删除好友) 一.建立数据表存储主机ip,接收信息端口port,nickname 在mysql数据库里建立chatusr数据表,表的格式为: 检测表是否存在和建立数据表的代码如下: vo

  • Java开发实现的Socket双向通信功能示例

    本文实例讲述了Java开发实现的Socket双向通信功能.分享给大家供大家参考,具体如下: 服务端 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java

  • Java中Connection timed out和Connection refused的区别讲解

    前言:这两个异常报出的时候,说明客户端没法正常连接到服务端,但是两者还是有区别的. 1:Connection timed out 在实际开发中经常会碰到Connection timed out的问题 java.net.ConnectException: Connection timed out (Connection timed out) at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPl

  • Java网络通信中ServerSocket的设计优化方案

    前言:在java的网络通信中,两个不同节点的主机想要进行通信则可以通过建立Socket对象(相当于客户端主机,向服务端请求发送信息)和ServerSocket对象(相当于服务端主机,接收客户端的连接请求并回复信息)实现. 1:创建一个Socket对象 Socket socket = new Socket("IP",port); 指定将要连接的服务端的ip地址和端口号来创建一个Socket对象,在创建结束之后便可对其进行输出.输入操作. 2:创建一个ServerSocket对象 Serv

  • 详解Java基础篇--面向对象1(构造方法,static、this关键字)

    面向对象,面向过程的区别.拿下五子棋来说: 面向过程分析: 开始游戏 黑棋先走 绘制画面 判断输赢 轮到白棋 绘制画面 判断输赢 返回步骤2 输出结果 面向对象分析: 黑白双方,双方行为是一模一样的 棋盘系统,负责绘制画面 规则系统,判断犯规.输赢 传统的面向过程编程是思考问题的解决步骤,这种思维方式适用于问题规模较小时.可是当问题规模大,要求程序有更好的可扩展性,能更快速地查错时面向对象设计思想就能体现出其优势.面向对象更接近人类地自然思维方式,将现实世界中的事物抽象为对象和对象的方法. 面向

  • Java的外部类为什么不能使用private和protected进行修饰的讲解

    Java的外部类为什么不能使用private和protected进行修饰 对于这个问题,一直没有仔细思考,今天整理一下: 对于顶级类(外部类)来说,只有两种修饰符:public和默认(default).因为外部类的上一单元是包,所以外部类只有两个作用域:同包,任何位置.因此,只需要两种控制权限:包控制权限和公开访问权限,也就对应两种控制修饰符:public和默认(default). 如果类使用了private修饰符,说明是个内部类.内部类的上一级是外部类,那么对应的有四种访问控制修饰符:本类(p

  • java使用socket实现一个多线程web服务器的方法

    除了服务器类,还包括请求类和响应类 请求类:获取客户的HTTP请求,分析客户所需要的文件 响应类:获得用户请求后将用户需要的文件读出,添加上HTTP应答头.发送给客户端. 服务器处理类 package com.lp.app.webserver; import java.io.*; import java.net.*; //使用Socket创建一个WEB服务器,本程序是多线程系统以提高反应速度. class WebServer { public static String WEBROOT = "&

随机推荐