手记

Java基于UDP实现服务器和多客户端之间的通信

UDPServer.java
package com.zh.socket;

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

/*
 * 服务器端,基于UDP的用户登录
 */

public class UDPServer {
    public static void main(String[] args) throws IOException{
        /*
         * 服务器端接受客户端的数据
         */
        DatagramSocket socket = new DatagramSocket(6666);
        System.out.println("***服务器端即将启动,等待客户端连接***");
        while(true){
            UDPServerThread st = new UDPServerThread(socket);
            st.start();
        }

    }

}

UDPClient.java
package com.zh.socket;

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 UDPClient {
    public static void main(String[] args) throws IOException {
        /*
         * 向服务器端发送请求
         */
        //1.定义服务器的地址,端口号,数据
        InetAddress address = InetAddress.getByName("localhost");
        int port = 6666;
        byte[] data = "用户名:zh;密码:456".getBytes();
        //2.创建数据报,包含发送的数据信息
        DatagramPacket packet = new DatagramPacket(data,data.length,address,port);
        //3.创建DatagramSocket用于数据的传输
        DatagramSocket socket = new DatagramSocket();
        //4.向服务器端发送数据报
        socket.send(packet);
        /*
         * 接收服务器端响应的数据
         */
        //1.创建数据报,用于接收服务器端的信息
        byte[] data2 = new byte[1024];
        DatagramPacket packet2 = new DatagramPacket(data2,data.length);
        //2.接收服务器端的信息
        socket.receive(packet2);//在接收到响应之前,此方法会一直处于阻塞状态
        //3.读取信息
        String reply = new String(data2,0,packet.getLength());
        //4.输出信息
        System.out.println("我是客户端,服务器端说:"+reply);
        //5.关闭资源
        socket.close();

    }

}

UDPServerThread.java
package com.zh.socket;

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

/*
 * 服务器线程处理类
 */
public class UDPServerThread extends Thread {
    /*
     * 线程执行的操作,响应客户端的请求
     */
    DatagramSocket socket = null;
    public UDPServerThread(DatagramSocket socket){
        this.socket = socket;
    }
    public void run(){
        /*
         * 服务器端接受客户端的数据
         */
        byte[] data = new byte[1024];//指定用于接受数据报的大小
        DatagramPacket packet = new DatagramPacket(data,data.length);
        try {
            socket.receive(packet);//接受到数据之前该方法处于阻塞状态
            String info = new String(data,0,packet.getLength());
            System.out.println("我是服务器,客户端说:"+info);
            /*
             * 服务器端向客户端进行响应
             */
            //1.定义客户端的地址,端口号,数据
            InetAddress address = packet.getAddress();
            int port = packet.getPort();
            byte[] data2 = "欢迎您!".getBytes();
            //2.创建数据报,包含相应信息
            DatagramPacket packet2 = new DatagramPacket(data2,data2.length,address,port);
            //3.响应客户端
            socket.send(packet2);
            //注意这里不能关闭socket,因为在UDPServer类的while是死循环,无法重新创建socket,所以这里不能关闭socket,否则无法进行下一个客户端的监听
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
8人推荐
随时随地看视频
慕课网APP

热门评论

while(true){ 

UDPServerThread st = new UDPServerThread(socket); 

st.start(); 

无限创建线程,程序启动的起来吗

我想问下,运行就显示404错误是怎么回事?

一启动服务端就死机。。。。。。。。。。。

查看全部评论