博客
关于我
通信从零起步
阅读量: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/

    你可能感兴趣的文章
    OpenCV与AI深度学习 | 实战 | 使用YoloV8实例分割识别猪的姿态(含数据集)
    查看>>
    OpenCV与AI深度学习 | 实战 | 基于YoloV5和Mask RCNN实现汽车表面划痕检测(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实践教程|旋转目标检测模型-TensorRT 部署(C++)
    查看>>
    OpenCV与AI深度学习 | 干货 | 深度学习模型训练和部署的基本步骤
    查看>>
    OpenCV与AI深度学习 | 手把手教你用Python和OpenCV搭建一个半自动标注工具(详细步骤 + 源码)
    查看>>
    OpenCV与AI深度学习 | 深度学习检测小目标常用方法
    查看>>
    Opencv中KNN背景分割器
    查看>>
    OpenCV中基于已知相机方向的透视变形
    查看>>
    OpenCV中的监督学习
    查看>>
    opencv中读写视频
    查看>>
    opencv之cv2.findContours和drawContours(python)
    查看>>
    opencv之namedWindow,imshow出现两个窗口
    查看>>
    opencv之模糊处理
    查看>>
    Opencv介绍及opencv3.0在 vs2010上的配置
    查看>>
    OpenCV使用霍夫变换检测图像中的形状
    查看>>
    opencv保存图片路径包含中文乱码解决方案
    查看>>
    OpenCV保证输入图像为三通道
    查看>>
    OpenCV入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    opencv图像分割2-GMM
    查看>>
    opencv图像分割3-分水岭方法
    查看>>