知识大全 使用Java实现数据报通讯过程
Posted 知
篇首语:书到用时方恨少,事非经过不知难。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 使用Java实现数据报通讯过程相关的知识,希望对你有一定的参考价值。
使用Java实现数据报通讯过程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
数据报(Datagram)使网络层数据单元在介质上传输信息的一种逻辑分组格式 它是一种在网络中传播的 独立的 自身包含地址信息的消息 它能否到达目的地 到达的时间 到达时内容是否会变化不能准确知道的 它的通讯双方是不需要建立连接的 对于一些不需要很高质量的应用程序来说 数据报通讯是一个非常好的选择 在Java的包中有两个类DatagramSocket和DatagramPacket 为应用程序中采用数据报通讯方式进行网络通讯 下面 我想详细解释在Java中实现客户端与服务器之间数据报通讯的方法 请看 一 客户端应用程序的工作流程 ) 首先要建立数据报通讯的Socket 我们可以通过创建一个DatagramSocket对象来实现它 在Java中DatagramSocket类有如下两种构造方法 a)public DatagramSocket() 构造一个数据报socket 并使其与本地主机任一可用的端口连接 若打不开socket则抛出SocketException异常 b) public DatagramSocket(int port) 构造一个数据报socket 并使其与本地主机指定的端口连接 若打不开socket或socket无法与指定的端口连接则抛出SocketException异常 ) 创建一个数据报文包 用来实现无连接的包传送服务 每个数据报文包是用DatagramPacket类来创建 DatagramPacket对象封装了数据报包数据 包长度 目标地址 目标端口 作为客户端要发送数据报文包 要调用DatagramPacket类以如下形式的构造函数创建DatagramPacket对象 将要发送的数据和包文目的地址信息放入对象之中 DatagramPacket(byte bufferedarray[] int length InetAddress address int port)即构造一个包长度为length的包传送到指定主机指定端口号上的数据报文包 参数length必须小于等于bufferedarry length DatagramPacket类提供了四个类来获取信息 a) public byte[] getData() 返回一个字节数组 包含收到或要发送的数据报中的数据 b) public int getLength() 返回发送或接收到的数据的长度 c) public InetAddress getAddress() 返回一个发送或接收此数据报包文的机器的IP地址 d) public int getPort() 返回发送或接收数据报的远程主机的端口号 )创建完DatagramSocket和DatagramPacket对象 就可以发送数据报文包了 发送是通过调用DatagramSocket对象的send方法实现 它需要以DatagramPacket对象为参数 将刚才封装进DatagramPacket对象中的数据组成数据报发出 )当然 我们也可以接收数据报文包 为了接收从服务器返回的结果数据报文包 我们需要创建一个新的DatagramPacket对象 这就需要用到DatagramPacket的另一种构造方式DatagramPacket(byte bufferedarray[] int length) 即只需指明存放接收的数据报的缓冲区和长度 调用DatagramSocket对象的receive()方法来完成接收数据报的工作 此时需要将上面创建的DatagramPacket对象作为参数 该方法会一直阻塞知道收到一个数据报文包 此时DatagramPacket的缓冲区中包含的就是接收到的数据 数据报文包中也包含发送者的IP地址 发送者机器上的端口号等信息 )处理接收缓冲区内的数据 获取服务结果 )当通讯完成后 可以使用DatagramSocket对象的close()方法来关闭数据报通讯Socket 当然 Java自己会自动关闭Socket 释放DatagramSocket和DatagramPacket所占用的资源 但是作为一种良好的编程习惯 还是要显示的予以关闭 下面我给出一个简单的利用数据报通讯的客户端程序 它能够完成与服务器简单的通讯 为了直观 我把它写成了Applet程序 由于本文不是介绍Applet 所以我只写了简要的注释 对Applet感兴趣的朋友亲参阅有关书籍 import java applet *; import java awt *; import *; import java io *; public final class javaCommunicationClient extends Applet private Label label label ; private Panel panel panel ; private TextField textfield; private TextArea textarea; private DatagramSocket sendSocket receiveSocket;//声明发送数据报Socket和接收数据报Socket private DatagramPacket sendPacket receivePacket;//声明发送数据报文包和接收数据报文包 public void init() setBackground(Color gray); setLayout(new BorderLayout());//设置一个布局管理器 panel =new Panel(); panel setLayout(new BorderLayout());//在容器中放置布局管理器 label =new Label( 通话纪录 ); textarea=new TextArea( );//文本显示区域 textarea setText( 欢迎您! ); panel add( North label );//将标签添加到布局管理器中 panel add( Center textarea); add( North panel ); label =new Label( 发言 );//创建另一个容器 panel add( Center label ); textfield=new TextField( ); textfield setText( ); panel add( South textfield); add( Center panel ); show(); public void start() waitForPackets(); public void waitForPackets() /*方法waitForPacket用来监听来自于服务器的数据报 当获得数据报后 在文本显示区域显示出来 */ try sendSocket=new DatagramSocket();//实例化一个发送数据报Socket对象 receiveSocket= new DatagramSocket( );//实例化一个接收数据报Socket对象 以 为端口 catch (SocketException e)//捕获异常 textarea appendText( 不能打开数据报Socket 或数据报Socket无法与指定端口连接! ); while (true) try byte buf[]=new byte[ ]; receivePacket=new DatagramPacket(buf buf length);//实例化一个接收数据报文包对象 receiveSocket receive(receivePacket);//以receivePacket为参数 接受文包 textarea appendText( \\n服务器 \\t ); byte[] data=receivePacket getData(); String receivedString=new String(data); textarea appendText(receivedString);//将接收到的数据报文报中的数据显示出来 catch(IOException e) textarea appendText( 网络通讯出现错误 问题在 +e toString()); public boolean action(Event e Object o) try textarea appendText( \\n客户端 ); String string=o toString(); textarea appendText(string); byte[] databyte=new byte[ ]; string getBytes( string length() databyte ); sendPacket=new DatagramPacket(databyte string length() InetAddress getByName( ) );//发送数据报 其中你可以用你自己的主机IP替换器中的IP地址 sendSocket send(sendPacket); catch(IOException ioe) textarea appendText( 网络通讯出现错误 问题在 +ioe toString()); return true; 二 服务器端应用程序的工作流程 不同于基于数据流通讯方式 在数据报通讯中 通讯双方之间并不要建立连接 所以 服务器应用程序通讯过程与客户端应用程序的通讯过程使非常相似的 也要建立数据报通讯DatagramSocket 构建数据报文包DatagramPacket 接收数据报和发送数据报 处理接收缓冲区内的数据 通讯完毕后 关闭数据报通讯Socket 不同的是 服务器应用程序要面向网络中的所有计算机 所以服务器应用程序收到一个包文后要分析它 得到数据报的源地址信息 这样才能创建正确的返回结果报文给客户机 下面我给出了一个数据报通讯的服务器段程序 由于服务器端的相应应用程序和客户端程序比较相似 所以我不想详细的注释 仅列出程序供大家参考 javaCommunicationServer java import *; import java io *; import java awt *; import java applet Applet; public final class javaCommunicationServer extends Frame private Label label label ; private Panel panel panel ; private TextField textfield; private String name name ; private TextArea textarea; private DatagramSocket sendSocket receiveSocket; private DatagramPacket sendPacket receivePacket; cha138/Article/program/Java/JSP/201311/19271相关参考
实际上就是非对称密钥加密RSA 但为什么不使用jca这些java自带的呢?因为android是非sun的虚拟机其实现方法有不同在现实使用中老是报错而且网上几乎没有资料谈到这些所以干脆自己写纯ja
利用Java存储过程简化数据库操作 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 利用Java存
Java串行端口通讯技术 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 了解串行通讯 串行通讯
Java数据库程序中的存储过程设计 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 本文阐述了怎么
如何在Oracle数据库中使用Java存储过程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 本
一个简单JAVA网络通讯录 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 定义一个简单的JAVA
Java中SOCKET通讯源码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! //ServeOn
利用Java实现串口全双工通讯 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一个嵌入式系统通常
Java中利用管道实现线程间的通讯 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在Java语言
JAVA与QQ网络通讯实例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 准备工作: 两个QQ