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

    你可能感兴趣的文章
    MSSQL数据库查询优化(一)
    查看>>
    MSSQL数据库迁移到Oracle(二)
    查看>>
    MSSQL日期格式转换函数(使用CONVERT)
    查看>>
    MSTP多生成树协议(第二课)
    查看>>
    MSTP是什么?有哪些专有名词?
    查看>>
    Mstsc 远程桌面链接 And 网络映射
    查看>>
    Myeclipse常用快捷键
    查看>>
    MyEclipse更改项目名web发布名字不改问题
    查看>>
    MyEclipse用(JDBC)连接SQL出现的问题~
    查看>>
    mt-datetime-picker type="date" 时间格式 bug
    查看>>
    myeclipse的新建severlet不见解决方法
    查看>>
    MyEclipse设置当前行背景颜色、选中单词前景色、背景色
    查看>>
    Mtab书签导航程序 LinkStore/getIcon SQL注入漏洞复现
    查看>>
    myeclipse配置springmvc教程
    查看>>
    MyEclipse配置SVN
    查看>>
    MTCNN 人脸检测
    查看>>
    MyEcplise中SpringBoot怎样定制启动banner?
    查看>>
    MyPython
    查看>>
    MTD技术介绍
    查看>>
    MySQL
    查看>>