创建四个类,实现双向聊天的功能。

接收线程:

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

public class ReceiveThread implements Runnable{
    private int port;
    public ReceiveThread (int port){
        this.port=port;
    }
    @Override
    public void run() {
        DatagramSocket ds = null;//如果要监听,则在构造的时候就要指定需要监听的端口。
        try {
            ds = new DatagramSocket(port);
            while(true){
                byte[] buf = new byte[1024];
                int length = buf.length;
                DatagramPacket dp = new DatagramPacket(buf,length);
                try {
                    ds.receive(dp);
                } catch (IOException e) {
                    e.printStackTrace();
                }

                String str = new String(dp.getData(),0,dp.getLength());
                InetAddress ip = dp.getAddress();

                System.out.println("来自:"+dp.getSocketAddress()+"的信息\n"+str+"\n-----------");
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }finally {
            ds.close();
        }
    }
}

发送线程:

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class SendThread implements Runnable{
    private int port;
    public SendThread (int port){
        this.port=port;
    }
    @Override
    public void run() {
        DatagramSocket ds = null;
        try {
            ds = new DatagramSocket();
            Scanner sc = new Scanner(System.in);

            while(true){
                //        byte[] buf = "我是王二萌remoo,你也可以叫我remoo".getBytes();
                String str = sc.next();
                if(str.equals("end"))break;
                byte[] buf = str.getBytes();
                int length = buf.length;
                InetAddress ip = null;
                try {
                    ip = InetAddress.getByName("localhost");
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                }

                DatagramPacket dp = new DatagramPacket(buf,length,ip,port);
                try {
                    ds.send(dp);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            ds.close();

        } catch (SocketException e) {
            e.printStackTrace();
        }
    }
}

用户1:

public class Chat_User01 {
    public static void main(String[] args) {

        //用户1的接收端线程启动
        ReceiveThread rt = new ReceiveThread(8898);
        new Thread(rt).start();

        //用户1的发送端口线程
        SendThread st = new SendThread(8899);
        new Thread(st).start();

    }
}

用户2:

public class Chat_User02 {
    public static void main(String[] args) {
        //用户2的接收端线程启动
        ReceiveThread rt = new ReceiveThread(8899);
        new Thread(rt).start();
        //用户1的发送端口线程
        SendThread st = new SendThread(8898);
        new Thread(st).start();
    }
}

 

然后启动用户1、用户2: