Java实现局域网内单播

来源:互联网 发布:js防水液体怎么用 编辑:程序博客网 时间:2024/05/21 08:26

前面我写过一篇文章讲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;}}

-------------------------------------------------Receiver.java---------------------------------------------------

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);}}}

-------------------------------------------------Sender.java---------------------------------------------------

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) {}}}

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

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

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

-------------------------------------------------Receiver.java---------------------------------------------------

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);}}}
-------------------------------------------------Sender.java---------------------------------------------------
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);}}}
测试跟前面一样。

0 0