Java UDP通信聊天程序

 编写两个新的VC程序,完成以下功能:
 一个程序为服务端,建立UDP服务端套接字。
 另外一个程序为客户端,建立UDP客户端套接字。
 这两个新程序可以互联,完成一个基于TCP/IP网络的文本聊天程序。

因为TCP需要三次握手,所以只能一来一回的实现聊天程序,而UDP可以只负责发送不管对方有没有接到,可以实现更符合现实中的聊天模式,即可以一端发送多条信息。

文件存放格式:
在这里插入图片描述
Send_Thread.java

package UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.util.Scanner;

public class Send_Thread extends Thread{

    //发送的socket端
    private DatagramSocket sender = null;
    //待发送的目标地址,InetSocketAddress用来储存IP套接字地址
    private InetSocketAddress address = null;
    //接收键盘输入
    Scanner scan = new Scanner(System.in);
    //构造函数
    public Send_Thread(DatagramSocket sender, InetSocketAddress address) {
        this.sender = sender;
        this.address = address;
    }

    public void run() {
        try {
            while (true) {
                //输入待发送的内容
                String input = scan.nextLine();
                if (input.equals("quit"))
                    break;
                byte[] data = null;
                data = input.getBytes("UTF-8");
                //创建UDP数据报
                DatagramPacket pack = new DatagramPacket(data, data.length, address);

                sender.send(pack);
            }

            System.out.println("聊天结束");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Receive_Thread.java

package UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Receive_Thread extends Thread{

    private static final int MAX_RECEIVE_BUFFER = 1024;  //最大接收缓存
    private DatagramSocket server;    //DatagramSocket类用来建立服务器和客户端
    private DatagramPacket packet;    //DatagramPacket类用来存入和解包UDP数据
    byte[] buffer = new byte[MAX_RECEIVE_BUFFER];
    //构造函数
    public Receive_Thread(DatagramSocket server) {
        this.server = server;
        packet = new DatagramPacket(buffer, buffer.length);
    }

    public void run() {
        try {
            String s = null;
            while (true) {
                //接收数据包
                server.receive(packet);
                s = new String(packet.getData(), packet.getOffset(), packet.getLength(), "UTF-8");
                //将接收的数据打印到控制台
                System.out.println(packet.getAddress() + "/" + packet.getPort() + ":" + s);
                packet.setLength(buffer.length);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Create.java

package UDP;

import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class Create {   //创建
    private int DEST_PORT = 0;
    private int SEND_PORT = 0;
    private int RECE_PORT = 0;
    private String IP = null;
    //构造函数储存IP和端口
    public Create(int DEST_PORT, int SEND_PORT, int RECE_PORT, String IP) {
        this.DEST_PORT = DEST_PORT;
        this.SEND_PORT = SEND_PORT;
        this.RECE_PORT = RECE_PORT;
        this.IP = IP;
    }
    public void run(){
        try {
            System.out.println("输入quit以结束聊天");
            Send_Thread send_thread = null;
            Receive_Thread receive_thread = null;
            InetSocketAddress address = null;
            //创建待接受数据包的目的机的端口号和IP地址
            address = new InetSocketAddress(IP, DEST_PORT);
            //创建发送的Socket端
            DatagramSocket sendsocket = new DatagramSocket(SEND_PORT);
            //创建接受的Socket端
            DatagramSocket recesocket = new DatagramSocket(RECE_PORT);
            //发送线程建立
            send_thread = new Send_Thread(sendsocket, address);
            //接受线程的建立
            receive_thread = new Receive_Thread(recesocket);

            send_thread.start();  //开启线程
            receive_thread.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Client.java

package UDP;

public class Client {

    private static final int DEST_PORT = 8888;
    private static final int SEND_PORT = 10000;
    private static final int RECE_PORT = 6666;
    private static final String IP = "127.0.0.1";

    public static void main(String[] args) {
        Create client = new Create(DEST_PORT,SEND_PORT,RECE_PORT,IP);
        client.run();
    }
}

Server.java

package UDP;

public class Server {

    private static final int DEST_PORT = 6666;
    private static final int SEND_PORT = 10001;
    private static final int RECE_PORT = 8888;
    private static final String IP = "127.0.0.1";

    public static void main(String[] args) {
        Create client = new Create(DEST_PORT,SEND_PORT,RECE_PORT,IP);
        client.run();
    }
}

结果:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Ramer42/article/details/83508784
今日推荐