本实例实现的是本机的两个进程通信。
发送端:
package Sender;
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 Sender {
public void sender() throws IOException{
InetAddress recieverHost=InetAddress.getByName("localhost"); //接收端为本机的一个进程
int reciecerPort=57834;//监听端口
String message="hello world"; //发送的信息
DatagramSocket mysoSocket=new DatagramSocket(); //创建客户端socket
byte[] buffer=message.getBytes(); //将发送的字符串进行平台编码
DatagramPacket datagram=new DatagramPacket(buffer, buffer.length,recieverHost,reciecerPort); //创建数据包
mysoSocket.send(datagram); //把该数据包发送到指定的套接字
mysoSocket.close(); //关闭
}
}
接收端:
package Reciever;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Reciever {
public void reciever() throws IOException{
final int MAX_LENGTH=10; //接收端能够接收的最大数据包长度
int port=57834; //将要绑定的端口
try{
DatagramSocket mySocket=new DatagramSocket(port); //创建接收端socket,并绑定到固定的端口
byte[] buffer=new byte[MAX_LENGTH]; //接受缓存
DatagramPacket datagram=new DatagramPacket(buffer, MAX_LENGTH); //创建接收端的数据包用来接收发送端发来的数据包
mySocket.receive(datagram); //监听端口
String message=new String(buffer);//取出接收到的数据
System.out.println(message);
mySocket.close();
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
控制端:
package Message_Socket;
import java.io.IOException;
import Reciever.Reciever;
import Sender.Sender;
public class SocketTest {
public static void main(String[] args) throws IOException{
Reciever reciever=new Reciever();
reciever.reciever();
Sender sender=new Sender();
sender.sender();
}
}
注意点:
1.如果运行时出现如下编译错误:
Unrecognized Windows Sockets error: 0: Cannot bind
(1)很可能是你使用的监听端口已被其他的进程使用,请选择其他端口,不能是知名端口(1-1024),还可以在DOS下查看是哪个进程使用了该接口,具体命令上网上查;
(2)将接收端的socket的创建及接受放在try-catch中;
2.接收端在运行recieve之后将被阻塞,即被挂起,直到有数据发送过来。
3.如果发送端发送的数据大小超过了接收端的缓存大小,那么超出的数据将被丢失。