使用说明
UDPManager是一个静态工具类。复制粘贴进去就可以使用。
使用前初始化:
1.通过UDPManager.init(port:Int)进行初始化。(默认本地端口为12306,可通过port参数修改)
2.通过UDPManager.setIPandPort(dstIP:String,dstPort:Int)设置目的IP和目的端口号。
使用时:
1.作为客户端:
使用sendMsg()进行发送,使用recvReplyMsg()接收对方的回复,ReplyBuf为收到的内容。
2.作为服务端:
使用recvMsg()接收对方的回复,使用sendReplyMsg()进行回复,RecvBuf为收到的内容。
可以通过getHisIP()获取客户的IP。
使用技巧:
可以直接本地做回环测试,完整的一个流程如下:
1.作为客户端 sendMsg()
2.作为服务器 recvMsg()
3.作为服务器 sendReplyMsg()
4.作为客户端 recvReplyMsg()
//作者:LC
//时间:2020/2/12/15:15
package com.example.minitankwar
import java.net.DatagramPacket
import java.net.DatagramSocket
import java.net.InetAddress
object UDPManager{
private lateinit var listenSocket:DatagramSocket
lateinit var listenPacket : DatagramPacket //等待监听的包
private lateinit var sendPacket : DatagramPacket //发往目的地的包
val RecvBuf = ByteArray(1024)
val ReplyBuf = ByteArray(1024)
private var dstIP = "127.0.0.1" //默认目的IP
private var dstPort = 12306 //默认目的端口
fun init(){
listenSocket = DatagramSocket(12306)//监听用的socket
}
fun init(port:Int)
{
listenSocket = DatagramSocket(port)//监听用的socket
}
fun setIPandPort(dstIP:String,dstPort:Int)
{
this.dstIP =dstIP
this.dstPort = dstPort
}
fun close(){
listenSocket.close()
listenSocket.close()
}
//使用12307端口向目标设置并发送信息
fun sendMsg(str:String){
val bytes = str.toByteArray()
sendPacket = DatagramPacket(bytes,bytes.size, InetAddress.getByName(dstIP), dstPort)
listenSocket.send(sendPacket)
}
fun sendMsg(bytes: ByteArray){
sendPacket = DatagramPacket(bytes,bytes.size, InetAddress.getByName(dstIP), dstPort)
listenSocket.send(sendPacket)
}
//使用12306端口回复目标信息(前提是接收过信息)
fun sendReplyMsg(str:String){
val bytes = str.toByteArray()
listenPacket = DatagramPacket(bytes,bytes.size, listenPacket.address, listenPacket.port)
listenSocket.send(listenPacket)
}
fun sendReplyMsg(bytes: ByteArray){
listenPacket = DatagramPacket(bytes,bytes.size, listenPacket.address, listenPacket.port)
listenSocket.send(listenPacket)
}
//来自服务器回复的信息接收
fun recvReplyMsg()
{
recv(listenSocket,ReplyBuf)
}
//来自客户端的信息
fun recvMsg()
{
listenPacket=recv(listenSocket,RecvBuf)
}
//获得对方的IP
fun getHisIP():InetAddress{
return listenPacket.address
}
private fun recv(socket: DatagramSocket, receiveBuf: ByteArray): DatagramPacket {
val receiverPacket = DatagramPacket(receiveBuf, receiveBuf.size)
socket.receive(receiverPacket)
return receiverPacket
}
}