udp server java_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();

}

}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值