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

    你可能感兴趣的文章
    mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
    查看>>
    mysql 主从互备份_mysql互为主从实战设置详解及自动化备份(Centos7.2)
    查看>>
    mysql 主从关系切换
    查看>>
    MYSQL 主从同步文档的大坑
    查看>>
    mysql 主键重复则覆盖_数据库主键不能重复
    查看>>
    Mysql 事务知识点与优化建议
    查看>>
    Mysql 优化 or
    查看>>
    mysql 优化器 key_mysql – 选择*和查询优化器
    查看>>
    MySQL 优化:Explain 执行计划详解
    查看>>
    Mysql 会导致锁表的语法
    查看>>
    mysql 使用sql文件恢复数据库
    查看>>
    mysql 修改默认字符集为utf8
    查看>>
    Mysql 共享锁
    查看>>
    MySQL 内核深度优化
    查看>>
    mysql 内连接、自然连接、外连接的区别
    查看>>
    mysql 写入慢优化
    查看>>
    mysql 分组统计SQL语句
    查看>>
    Mysql 分页
    查看>>
    Mysql 分页语句 Limit原理
    查看>>
    MySql 创建函数 Error Code : 1418
    查看>>