天天看點

使用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;

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實作多使用者登入,運用多線程

我們修改一下用戶端發送的内容再看:

使用UDPSocket實作多使用者登入,運用多線程

這時伺服器就顯示有兩個使用者登入

用戶端:

使用UDPSocket實作多使用者登入,運用多線程