博客
关于我
通信从零起步
阅读量:787 次
发布时间:2019-03-24

本文共 3576 字,大约阅读时间需要 11 分钟。

通信从零起步


当我们要实现网络程序的通信时,最基本的方式就是通过 socket(套接字)进行数据的交换。套接字是网络编程中的核心概念,它类似于两个管道的接口,用于不同程序之间的通信。在Java中,socket 可以分为两种形式:大写的 Socket 和小写的 socket。此处的大写的 Socket 实际上是一个库,而小写的 socket 则是程序组件的名称。

当我们创建一个 socket 时,Java 系统会分配一段内存空间,用来存储通信过程中需要控制的信息,如 IP 地址、端口号、通信状态等。这种分配实质上是为 socket Prepare for Communication。

客户端创建 socket 后,会用管道连接到服务器端的 socket,而服务器端也会创建 socket,并将其设置为等待连接状态。这样一来,两者就可以完成通信的准备工作。


ServerSocket

除了 socket 外,还有一个专门用于服务器的类——serverSocket。当服务器创建好 socket 后,它会一直处于等待客户端连接的状态。一旦接收到连接请求,服务器就创建一个 socket 实例与客户端进行通信。这么做有个别的用处,即服务器可以同时处理多个客户端连接。

在代码层面,这可以这样实现:

ServerSocket serSocket = new ServerSocket(9090);Socket ser = serSocket.accept();

这里的 serSocket.accept() 会返回一个 socket 实例,用于与客户端进行通信。这个方法处理连接操作后,会启动客户端通信模块,并将控制好的 socket 交给该模块处理通信相关操作。


代码演示——数据传输

为了更好地理解通信过程,我们可以通过如下的代码实现一个简单的数据交换。

客户端

package com.test;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;public class Client {    public static void main(String[] args) {        try {            Socket socket = new Socket("127.0.0.1", 9090);            OutputStream out = socket.getOutputStream();            InputStream input = socket.getInputStream();                        // 发送数据            out.write("I am client!".getBytes());            out.flush();                        // 读取数据            byte[] buffer = new byte[1024];            int bytesRead = -1;            while ((bytesRead = input.read(buffer)) != -1) {                System.out.println("Received: " + bytesRead + " bytes");                String receivedMsg = new String(buffer, 0, bytesRead);                System.out.println("Message from server: " + receivedMsg);            }        } catch (IOException e) {            e.printStackTrace();        }    }}

服务器

package com.test;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;public class Server {    public static void main(String[] args) {        try {            ServerSocket serverSocket = new ServerSocket(9090);            Socket server = serverSocket.accept();                        // 返回给客户端的输出流和读取流            OutputStream out = server.getOutputStream();            InputStream input = server.getInputStream();                        // 发送数据            out.write("I am Server!".getBytes());            out.flush();                        // 读取客户端的数据            byte[] buffer = new byte[1024];            int bytesRead = -1;            while ((bytesRead = input.read(buffer)) != -1) {                System.out.println("Received: " + bytesRead + " bytes");                String receivedMsg = new String(buffer, 0, bytesRead);                System.out.println("Message from client: " + receivedMsg);            }        } catch (IOException e) {            e.printStackTrace();        }    }}

图片和文本数据转发

在实际应用中,除了简单的文本数据外,传输图片、视频等大数据也需要考虑优化。由于视频是由多个图片持续播放而成的,我们的视频传输过程实际上可以看作是一系列的图片传输。

实现图片传输时,我们可以将图片的二进制数据通过 socket 传输。每个图片分割成多个小块,然后以一定频率发送出去。这可以避免传输大数据时的连接中断。


主界面

对于 socket 通信程序的主界面设计,我们可以采用简单而直观的布局方法。考虑界面布局的同时,注重新构建用户体验。

界面中可以包含以下组件:

  • 显示连接状态的标签
  • 接收数据的文本框
  • 发送数据的输入框和按钮
  • 与服务器的连接状态显示
  • 通过对这些组件的布局规划,可以让用户快速看到当前连接状态和数据传输情况。


    当前界面实现效果

    下面是当前界面的一些实现效果展示:

  • 当数据发送成功,发送框中的输入文本会被清空
  • 当数据接收完成,接收框中的内容会完整显示新的数据
  • 当网络状态异常时,界面会提供相应的提示信息

  • 事件响应设计

    为了使得界面更加智能和用户友好,我们需要对各种事件做出响应:

  • 按钮点击事件:触发发送数据操作
  • 输入事件:实时更新发送数据内容
  • 连线状态变化事件:显示不同连接状态的提示
  • 通过将这些事件添加到相应的 listener 中,可以让界面更加灵活和智能。


    异常处理

    在 socket 编程中,由于网络本身的不确定性,可能会出现各种异常情况,比如无法连接、数据读取超时等。因此,在程序中需要对这些情况进行处理,比如展示友好的提示信息或者系统提示。


    总结

    通过以上对 socket 和通信过程的分析,可以看到 socket 编程虽然有点复杂,但只要掌握了基础的原理和常用方法,就能实现简单而有用的网络通信功能。在实际应用中,可以通过不断优化协议和提升传输效率,实现更加高效的通信体验。

    转载地址:http://djekk.baihongyu.com/

    你可能感兴趣的文章
    NHibernate异常:No persister for的解决办法
    查看>>
    Nhibernate的第一个实例
    查看>>
    NHibernate示例
    查看>>
    nid修改oracle11gR2数据库名
    查看>>
    NIFI1.21.0/NIFI1.22.0/NIFI1.24.0/NIFI1.26.0_2024-06-11最新版本安装_采用HTTP方式_搭建集群_实际操作---大数据之Nifi工作笔记0050
    查看>>
    NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_插入时如果目标表中已存在该数据则自动改为更新数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0058
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0_Postgresql和Mysql同时指定库_指定多表_全量同步到Mysql数据库以及Hbase数据库中---大数据之Nifi工作笔记0060
    查看>>
    NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
    查看>>
    NIFI1.21.0最新版本安装_配置使用HTTP登录_默认是用HTTPS登录的_Https登录需要输入用户名密码_HTTP不需要---大数据之Nifi工作笔记0051
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增加修改实时同步_使用JsonPath及自定义Python脚本_03---大数据之Nifi工作笔记0055
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
    查看>>
    NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现update数据实时同步_实际操作05---大数据之Nifi工作笔记0044
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>