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的机制感觉很好
在书上找到“三次握手,四次挥手“的答案
感觉越学问题越多,越想在细节上突破
知其然,更要知其所以然
比如线程这一章节,老师上课讲的例题都有点浅,到实战的时候就感觉不知所措
所以下一步深入学习线程,还会有一篇网络通信基础!

原文地址:https://www.cnblogs.com/hzcya1995/p/13310001.html