Java实现局域网内单播

前面我写过一篇文章讲java实现组播,今天我们就来看看java怎么实现局域网内单播。

我们先来补充一下网络编程的两个要点:

1. 以进程为对象来看待问题会比较简单一点。进程是最小的程序单元,而网络进程在建立网络连接的时候会占用一个端口。

2. 我们所说的单播和组播,其实都是进程间通信。

所以实现单播最重要的是指定IP地址和进程端口。

如果是本机测试,IP地址相同是必然的,只要发送进程和接收进程使用不同的端口(注意在发送时保持目的端口与接收进程的端口一致)就可以互相通信,否则会出现IP地址被占用的异常。

局域网内单播有两种实现方式:一种是无连接方式,另一种是面向连接方式。

我们先来看无连接的方式:

首先我们继承DatagramSocket类,并封装了发送和接收消息的方法。

import java.net.*;
import java.io.*;

/**
 * 继承数据报套接字类
 * 实现发送消息和接收消息的方法
 * @author michael
 *
 */
public class MyDatagramSocket extends DatagramSocket {
	static final int MAX_LEN = 100;

	MyDatagramSocket() throws SocketException {
		super();
	}

	MyDatagramSocket(int port) throws SocketException {
		super(port);
	}

	public void sendMessage(InetAddress receiverHost, int receiverPort,
			String message) throws IOException {
		byte[] sendBuffer = message.getBytes();
		DatagramPacket datagram = new DatagramPacket(sendBuffer,
				sendBuffer.length, receiverHost, receiverPort);
		this.send(datagram);
	}

	public String receiveMessage() throws IOException {
		byte[] receiveBuffer = new byte[MAX_LEN];
		DatagramPacket datagram = new DatagramPacket(receiveBuffer, MAX_LEN);
		this.receive(datagram);
		String message = new String(receiveBuffer);
		return message;
	}
}

接下来我们看接收方:

import java.net.*;

/**
 * 采用无连接的方式实现进程间通信
 * @author michael
 *
 */
public class Receiver {

	public static void main(String[] args) {
		try {
			InetAddress receiverHost = InetAddress.getByName("127.0.0.1");
			int myPort = 1234;// 本进程端口
			int receiverPort = 5689;// 接收进程的端口
			String message = "Hi Sender";
			MyDatagramSocket mySocket = new MyDatagramSocket(myPort);
			System.out.println(mySocket.receiveMessage());
			mySocket.sendMessage(receiverHost, receiverPort, message);
			mySocket.close();
		} catch (Exception ex) {
			System.out.println(ex);
		}
	}
}

发送方:

import java.net.*;

/**
 * 采用无连接的方式实现进程间通信
 * @author michael
 *
 */
public class Sender {

	public static void main(String[] args) {
		try {
			InetAddress receiverHost = InetAddress.getByName("127.0.0.1");
			int myPort = 5689;
			int receiverPort = 1234;
			String message = "Hello Receiver";
			MyDatagramSocket mySocket = new MyDatagramSocket(myPort);
			mySocket.sendMessage(receiverHost, receiverPort, message);
			System.out.println(mySocket.receiveMessage());
			mySocket.close();
		} catch (Exception ex) {
			
		}
	}
}

代码里面我采用的是本机测试,不过我试过了联机测试,是可以的。

下面再看面向连接的方式:

向连接的方式跟无连接的方式大体相同,只是多了一个建立连接和断开连接的过程。

import java.net.*;

/**
 * 采用面向连接的方式实现进程间通信
 * @author michael
 *
 */
public class Receiver {

	public static void main(String[] args) {
		try {
			InetAddress senderHost = InetAddress.getByName("127.0.0.1");
			int senderPort = 1234;
			int myPort = 4568;
			String message = "Hi Sender";
			MyDatagramSocket mySocket = new MyDatagramSocket(myPort);
			//与对方建立连接
			mySocket.connect(senderHost, senderPort);
			System.out.println(mySocket.receiveMessage());
			mySocket.sendMessage(senderHost, senderPort, message);
                        //断开连接
			mySocket.disconnect();
			mySocket.close();
		}
		catch (Exception ex) {
			System.out.println("An exception has occured: " + ex);
		}
	}
}
import java.net.*;

/**
 * 采用面向连接的方式实现进程间通信
 * @author michael
 *
 */
public class Sender {

	public static void main(String[] args) {
		try {
			InetAddress receiverHost = InetAddress.getByName("127.0.0.1");
			int receiverPort = 4568;
			int myPort = 1234;
			String message = "Hello Receiver";
			MyDatagramSocket mySocket = new MyDatagramSocket(myPort);
			mySocket.connect(receiverHost, receiverPort);
			mySocket.sendMessage(receiverHost, receiverPort, message);
			System.out.println(mySocket.receiveMessage());
			mySocket.disconnect();
			mySocket.close();
		}
		catch (Exception ex) {
			System.out.println(ex);
		}
	}
}
测试跟前面一样。

Java实现局域网内单播,布布扣,bubuko.com

Java实现局域网内单播

上一篇:JavaScript中对象与函数的某些事[JavaScript语言精粹-N1]


下一篇:形象化的spring 依赖注入原理