练习:UDP聊天程序
通过键盘录入获取要发送的信息。
将发送和接收分别封装到两个线程中。
聊天方一:
<span style="font-size:14px;">package cn.hncu.url.udp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import com.sun.imageio.plugins.common.InputStreamAdapter;
public class UDPChat {
public static void main(String[] args) {
try {
DatagramSocket send=new DatagramSocket(10001);
DatagramSocket receive=new DatagramSocket(10002);
new Thread(new Send(send)).start();
new Thread(new Receive(receive)).start();
} catch (SocketException e) {
e.printStackTrace();
}
}
}
class Send implements Runnable{
private DatagramSocket ds=null;
public Send(DatagramSocket ds){
this.ds=ds;
}
@Override
public void run() {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line=null;
try {
while ((line=br.readLine())!=null){
byte buf[]=line.getBytes();
//下面的ip地址我用xxx.xxx.xxx.xxx表示,这里要使用你自己的ip地址,运行时记得改过来
DatagramPacket dp=new DatagramPacket(buf, buf.length,InetAddress.getByName("</span><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:14px;">xxx.xxx.xxx.xxx</span></span><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:14px;">"),10004);</span></span><span style="font-size:14px;">
ds.send(dp);
if (line.equalsIgnoreCase("over")){
break;
}
}
// ds.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Receive implements Runnable{
private DatagramSocket ds=null;
public Receive(DatagramSocket ds){
this.ds=ds;
}
@Override
public void run() {
byte buf[]=new byte[1024];
try {
while (true){
DatagramPacket dp=new DatagramPacket(buf, buf.length);
ds.receive(dp);
byte data[]=dp.getData();
String ip=dp.getAddress().getHostAddress();
String info=new String(data);
System.out.println(ip+" says "+info);
if (info.equalsIgnoreCase("over")){
System.out.println(ip+" has left the chatting room......");
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}</span>
聊天方二:
package cn.hncu.url.udp.chat2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import com.sun.imageio.plugins.common.InputStreamAdapter;
public class UDPChat2 {
public static void main(String[] args) {
try {
DatagramSocket send=new DatagramSocket(10003);
DatagramSocket receive=new DatagramSocket(10004);
new Thread(new Send(send)).start();
new Thread(new Receive(receive)).start();
} catch (SocketException e) {
e.printStackTrace();
}
}
}
class Send implements Runnable{
private DatagramSocket ds=null;
public Send(DatagramSocket ds){
this.ds=ds;
}
@Override
public void run() {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line=null;
try {
while ((line=br.readLine())!=null){
byte buf[]=line.getBytes();
//下面的ip地址我用xxx.xxx.xxx.xxx表示,这里要使用你自己的ip地址,运行时记得改过来
DatagramPacket dp=new DatagramPacket(buf, buf.length,InetAddress.getByName("<span style="font-family: Arial, Helvetica, sans-serif;">xxx.xxx.xxx.xxx</span><span style="font-family: Arial, Helvetica, sans-serif;">"),10002);</span>
ds.send(dp);
if (line.equalsIgnoreCase("over")){
break;
}
}
ds.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Receive implements Runnable{
private DatagramSocket ds=null;
public Receive(DatagramSocket ds){
this.ds=ds;
}
@Override
public void run() {
byte buf[]=new byte[1024];
try {
while (true){
DatagramPacket dp=new DatagramPacket(buf, buf.length);
ds.receive(dp);
byte data[]=dp.getData();
String ip=dp.getAddress().getHostAddress();
String info=new String(data);
System.out.println(ip+" says "+info);
if (info.equalsIgnoreCase("over")){
System.out.println(ip+" has left the chatting room......");
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}