• Socket通信机制(内含代码)之第二篇


    数据报通信方式

    UDP:是传输层的无连接通信协议
    数据报是一种在网络中独立传播的自身包含地址信息的消息,它能否到达目的地.到达的时间以到达时的内容能否保持不变,这些都是不能保证,数据报是一种很基本的通信方式

    Java.net提供了两个类:DatagramSocket和DatagramPacket支持数据报方式通信

    简单介绍:DatagramSocket的对象是数据报通信的Socket,DatagramPacket的对象是一个数据报
    在数据报方式实现Client/Server通信程序时,无论在Client端还是Server端,都要首先建立一个DatagramSocket对象
    用来表示数据报通信的端点,应用程序通过该Socket接受或发送数据报,然后使用DatagramPacket对象封装数据报

    (1).DatagramSocket
    DatagramSocket()//与本机任何可用端口绑定
    DatagramSocket(int port)//与指定的端口绑定
    DatagramSocket(int port,InetAddress iaddr)//与指定的本地地址的指定的端口绑定
    InetAddress iaddr用来表示一个IP地址

    (2).DatagramPacket
    DatagramPacket对象中封装了数据报(数据)数据长度,数据报地址等信息。
    DatagramPacket类的构造方法可以构造两种用途的数据报:接受外来数据的数据报和要向外发送的数据报
    (1).用于接收的数据报的构造
    DatagramPacket(byte[] buf , int length)
    构造用于接收长度为length的数据报,数据报保存在数组buf中。注意length必须小于或等于buf.length
    DatagramPacket(byte[] buf,int offest, int length)
    构造用于接收长度为length的数据报,并指定数据报在存储区buf中的偏移量

    (2).用于发送的数据报构造
    DatagramPacket(byte[] buf,int length,InetAddress address,int port)
    构造用于发送指定长度的数据报,数据报将发送到指定的主机的指定端口。其中,buf是数据报中的数据,length是数据报的长度
    address是目的地址,port是目的端口

    数据报方式的通信过程(三步骤)
    (1).创建数据报Socket
    (2) .构造用于接收或发送的数据报,并调用所创建的Socket的receive()方法进行数据报接收或调用send()发送数据报
    (3).通信结束,关闭Socket

    数据报通信实例
    Server端`

    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    
    public class MyUdpServer {
       DatagramSocket socket=null;
       BufferedReader in=null;
       boolean moreQuotes=true;
       public void serverWork() throws IOException {
    	   socket=new DatagramSocket(4445);
    	   in=new BufferedReader(new FileReader("C:\Users\YANG\eclipse-workspace\test\src\test\sentences.txt"));
    	   while(moreQuotes) {
    		   //构建接收数据报并启动
    		   byte[] buf=new byte[256];
    		   DatagramPacket packet=new DatagramPacket(buf,buf.length);
    		   socket.receive(packet);
    		   //接收到Client端的数据报,并从sentences.txt中读取一行
    		   //作为响应数据报并发送
    		   String dString=null;
    		   if((dString=in.readLine())==null) {
    			   in.close();
    			   moreQuotes=false;
    			   dString="No more sentences.Bye!";
    			   
    		   }
    		   buf=dString.getBytes();
    		   //从接收到的数据报中获取Client端的地址和端口
    		   //构造相应数据报并发送
    		   InetAddress address=packet.getAddress();
    		   int port=packet.getPort();
    		   packet=new DatagramPacket(buf,buf.length,address,port);
    		   socket.send(packet);
    	   }
    	   socket.close();
       }
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
            MyUdpServer server=new MyUdpServer();
            try {
    			server.serverWork();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    }

    Client端:

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    
    public class MultiUdpClient {
    
    	public static void main(String[] args) throws IOException  {
    		// TODO Auto-generated method stub
    	DatagramSocket socket=new DatagramSocket();//创建数据报
    	byte[] buf=new byte[256];//构建请求数据报并发送
    	InetAddress address=InetAddress.getByName("localhost");
    	
    	DatagramPacket packet=new DatagramPacket(buf,buf.length,address,4445);
    	socket.send(packet);
    	//构建请求数据报并启动接收
        packet=new DatagramPacket(buf,buf.length);
    	socket.receive(packet);	
        String Received=new String(packet.getData());
        System.out.println("服务器发来的信息:
    "+Received);
        socket.close();
    	}
    
    }

    其中sentences.txt就放在你的项目下
    地址为右键sentences.txt——>porperities,找到该文件在你电脑上的地址就可以了

    我也是跟着Java语言程序重新学习了Socket通信机制
    之前的学习停留在表面浅显的认知,这次学习到Socket的机制感觉很好
    在书上找到“三次握手,四次挥手“的答案
    感觉越学问题越多,越想在细节上突破
    知其然,更要知其所以然
    比如线程这一章节,老师上课讲的例题都有点浅,到实战的时候就感觉不知所措
    所以下一步深入学习线程,还会有一篇网络通信基础!

  • 相关阅读:
    android.animation(6)
    android.animation(5)
    android.animation(4)
    android.animation(3)
    android.animation(2)
    android.animation(1)
    android.view.animation(2)
    php热身2:CRUD with Ajax
    PHP热身
    Android热身:通过网络获取资源并更新UI组件
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13310001.html
Copyright © 2020-2023  润新知