udp 通信java例_Java实例练习——基于UDP协议的多客户端通信

昨天学习了UDP协议通信,然后就想着做一个基于UDP的多客户端通信(一对多),但是半天没做出来,今天早上在参考了很多代码以后,修改了自己的代码,然后运行成功,在这里分享以下代码,也说一下自己的认识误区:

代码如下:

//最核心的部分是在服务器端的线程部分

package net;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

public class UdpServerThread extends Thread {

DatagramSocket socket = null;

DatagramPacket getPacket = null;

byte []msg = null;

public UdpServerThread(DatagramSocket socket,DatagramPacket getPacket,byte []msg){

this.socket = socket;

this.getPacket = getPacket;

this.msg = msg;

}

public void run(){

//1、创建DategramSocket,指定端口号

System.out.println("我是服务器,客户端说:"+new String(msg,0,getPacket.getLength()));

System.out.println("客户端的IP地址:"+getPacket.getAddress());

//服务器向客户端发送响应信息

byte[] sendMsg = "欢迎您!".getBytes();

DatagramPacket sendPacket = new DatagramPacket(

sendMsg, sendMsg.length, getPacket.getAddress(), getPacket.getPort());

try {

socket.send(sendPacket);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

//然后是服务器端

package net;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

/**

* 基于UDP协议的通信,服务器端

* @author syskey

*

*/

public class UdpManyClientServ {

public static void main(String args[]) throws IOException{

//1、创建DategramSocket,指定端口号

int clientCount = 0;

DatagramSocket socket = new DatagramSocket(8800);

System.out.println("***服务器正在启动,等待客户端连接***");

byte[] msg = new byte[1024];

//2、创建Data个人啊没Packet,用于接收客户端信息

DatagramPacket getPacket =null;

//2、创建Data个人啊没Packet,用于接收客户端信息

while(clientCount<10){

try {

getPacket = new DatagramPacket(msg, msg.length);

socket.receive(getPacket);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

UdpServerThread udpServerThread =new UdpServerThread(socket,getPacket,msg);

udpServerThread.start();

clientCount++;

System.out.println("客户端数量"+clientCount);

//System.out.println("客户端的IP地址:"+socket.getInetAddress().getHostAddress());

//}

//socket.close();

}

}

}

//客户端相对简单

package net;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.SocketException;

/**

* 基于UDP通信的客户端

* @author syskey

*

*/

public class UdpClient {

public static void main(String args[]) throws IOException{

byte[] sMsgbyte = "用户名:sysker;密码:128398908".getBytes();

InetAddress serverIp = InetAddress.getByName("localhost");

DatagramPacket packet = new DatagramPacket(sMsgbyte, sMsgbyte.length, serverIp, 8800);

DatagramSocket socket = null;

try {

socket = new DatagramSocket();

} catch (SocketException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

socket.send(packet);

byte[] getMsg = new byte[1024];

DatagramPacket getPacket = new DatagramPacket(getMsg, getMsg.length);

socket.receive(getPacket);

System.out.println("我是客户端,服务器说:"+new String(getMsg,0,getPacket.getLength()));

socket.close();

}

}

实现UDP协议多客户端通信与TCP/IP协议不同,TCP/IP中和客户端相关就一个通信类(Socket类),但是对UDP协议来说和客户端相关的通信类有两个(DatagramSocket和DatagramPacket),而在多客户端通信中,核心部分就是处理客户端的通信类,所以思路是一样的。但一开始我就套用TCP/IP协议下的多客户端通信,没有认真的分析UDP通信协议的特点,更没有对比TCP/IP协议和UDP协议的区别,所以导致UDP多客户端通信不能实现。

总结:学习JAVA时,不能生搬硬套,一定分析清楚其中的原理和区别,然后再去开始实践,不能上来就开始干代码。同时,在我们觉得自己已经掌握了某一个知识点时,最好是通过实践来练习一下,哪怕只是把之前你参考别人代码写的程序,重新按照刚才的思路写一遍,收获绝对不小,但前提条件是理解清楚原理,搞清楚思路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值