使用UDPSocket实现多用户登录,运用多线程

客户端代码

package com.imooc;


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=8800;
byte[] data="用户名:admin,密码:123".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, data2.length);
//2.接收服务器响应数据
socket.receive(packet2);
//3.读取数据
String reply=new String(data2, 0, packet.getLength());
System.out.println("我是客户端,服务器说:"+reply);
//4.关闭资源
socket.close();
}

}


服务器端代码

package com.imooc;


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


/*
 * 服务器端,实现基于UDP的用户登录
 * 
 * */
public class UDPLianxiServer {
public static void main(String[] args) throws IOException {

/*
* 接收客户端发送的数据
* */
//1.创建服务器端DatagramSocket,指定端口
DatagramSocket socket=new DatagramSocket(8800);
// //2.创建数据报,用于接受客户端发送过来的数据
// byte[] data=new byte[1024];
// DatagramPacket packet=new DatagramPacket(data, data.length);
// //3.接收客户端发送的数据
// System.out.println("服务器端已经启动,等待客户端发送数据");
// socket.receive(packet);//此方法在接收到数据前会一直阻塞状态
int count=0;
while (true) {
byte[] data=new byte[1024];
DatagramPacket packet=new DatagramPacket(data, data.length);
//3.接收客户端发送的数据
System.out.println("服务器端已经启动,等待客户端发送数据");
socket.receive(packet);//此方法在接收到数据前会一直阻塞状态
count++;
System.out.println("当前登录用户:"+count);
LianxiThread lianxiThread =new LianxiThread(packet, socket);
lianxiThread.start();
}


// //4.读取数据 //获取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);
// socket.send(packet2);
// //关闭资源
// socket.close(); 

}}



创建Thread线程类,需要继承Thread     在接收客户端发送的数据时出现了问题,接收不到客户端发的信息,但客户端可以接收到服务器端的信息,把(data, 0, packet.getLength())里的data换成packet.getData()就能获取到

//String info=new String(data, 0, packet.getLength());

//4.读取数据 //获取packet的长度
String info=new String( packet.getData(), 0, packet.getLength());

package com.imooc;


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


public class LianxiThread extends Thread{

DatagramPacket packet=null;  
DatagramSocket socket=null;
    public LianxiThread(DatagramPacket packet,DatagramSocket socket){  
        this.packet=packet;  
        this.socket=socket;
    }  
public void run(){
 
// byte[] data=new byte[1024];
//String info=new String(data, 0, packet.getLength());
//4.读取数据 //获取packet的长度
String info=new String(packet.getData(), 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);
try {
socket.send(packet2);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//关闭资源
// socket.close(); 
}

}


测试结果:首先运行服务器,再运行客户端

服务器端:使用UDPSocket实现多用户登录,运用多线程_第1张图片


我们修改一下客户端发送的内容再看:使用UDPSocket实现多用户登录,运用多线程_第2张图片


这时服务器就显示有两个用户登录


客户端:使用UDPSocket实现多用户登录,运用多线程_第3张图片

你可能感兴趣的:(使用UDPSocket实现多用户登录,运用多线程)