您的位置:首页 > 其它

基于UDP协议的简单聊天程序

2016-10-24 17:04 603 查看
摘要:使用JAVA语言,基于UDP协议,实现了简单UDP聊天程序,在不同主机之间收发信息。

1 程序功能

输入:目标主机的IP地址、端口

功能:接收用户输入,将信息发送到目标主机的对应端口上,如果目标计算机也运行此程序,会显示信息,并接受目标主机写回信息。

2 程序结构



图1 程序UML图

程序实现了三个类,其中UDPSender类与UDPReceiver类实现了Runnable接口,作为独立线程分别实现UDP数据包的发送与接收。UDPSender线程接收用户输入,将其发送到目标主机的制定端口上,UDPReceiver线程从本机的默认端口(由用户设置)上监听到来的信息并显示。UDPClient类启动以上两个线程,并且根据用户的输入建立java.net.DatagramSocket对象,用于以上两个线程收发信息。

public void start(){
try{
udpSocket = new DatagramSocket(localPort);
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute( new UDPSender(udpSocket,remoteHost, remotePort) );
exec.execute( new UDPReceiver(udpSocket) );
Thread.yield();
}catch( SocketException e ){
System.out.println( "Error with creating socket" );
System.exit(0);
}
}


在UDPClient中,将java.net.DatagramSocket对象作为参数传递给UDPSender与UDPReceiver,使用Executor执行以上两个线程(上述代码所示)。

public void run() {
while( !Thread.interrupted() ){
BufferedReader in = new BufferedReader( new InputStreamReader (System.in) );
try {
String theLine = in.readLine();
if( theLine.equals("exit") ){
//used for stop UDPReceiver thread
udpSocket.close();
break;
}
byte[] data = theLine.getBytes();

InetAddress ip = InetAddress.getByName(remoteHost);
DatagramPacket sendPacket = new DatagramPacket( data, 0, data.length, ip, remotePort);

udpSocket.send(sendPacket);
Thread.yield();
} catch (IOException e) {
System.out.println("IO Exception occured");
}
}// end while(36)
}


在UDPSender中,使用BufferedReader接受用户的输入,创建java.net.DatagramPacket对象存储要发送的数据,并调用java.net.DatagramSocket的send方法将数据发送到目标主机(上述代码所示)。

public void run(){
//receiver thread is terminate by closing IO resource here, instead of using interrupt.
while( !Thread.interrupted() ){
byte[] data = new byte[RB_SIZE];
DatagramPacket recvPacket = new DatagramPacket( data, data.length );
try {
udpSocket.receive(recvPacket);
//recvPacket.getLength() returns the length of data received
String result = new String(recvPacket.getData(), 0, recvPacket.getLength());
String remoteHost = recvPacket.getAddress().getHostAddress();
System.out.println( remoteHost + " says: " + result );
Thread.yield();
} catch (IOException e) {
System.out.println("bye");
System.exit(0);
}
} //end while(24)
}


在UDPSender中,创建空的java.net.DatagramPacket对象存储要接受到的数据,并调用java.net.DatagramSocket的receive方法接受数据, 并显示(上述代码所示)。

3 源代码

程序源代码见github:jitianyu/java-udp-talker

参考文献

[1] Harold E R. Java network programming, third edition[M]. O’ReillyMedia, Inc. 2004.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: