Unity与java后端UDP通信
1. unity客户端代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Text;
using System;public class Udp : MonoBehaviour
{static Socket client; // clientstatic Thread reciveThread;static Thread sendThread;static EndPoint server;void Start(){server = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8800);client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);client.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6666));//绑定端口号和IPreciveThread = new Thread(ReciveMsg);//开启接收消息线程reciveThread.Start();sendThread = new Thread(()=>SendMsg("hello, first time"));//开启发送消息线程sendThread.Start();}// Update is called once per framevoid Update(){if (Input.GetKeyDown(KeyCode.M)) {String msg = "time:" + Time.deltaTime;SendMsg(msg);}}void OnDestroy() {client.Close();}/// <summary>/// 向特定ip的主机的端口发送数据报/// </summary>static void SendMsg(String msg){client.SendTo(Encoding.UTF8.GetBytes(msg), server);}/// <summary>/// 接收发送给本机ip对应端口号的数据报/// </summary>static void ReciveMsg(){while (true){Thread.Sleep(100);EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号byte[] buffer = new byte[1024];int length = client.ReceiveFrom(buffer, ref point);//接收数据报string message = Encoding.UTF8.GetString(buffer,0,length);Debug.Log(message);}}
}
2. java服务端代码:
package cn.com.zh.udp;import cn.com.zh.qmcq.All;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class UDPServer {public static void main(String[] args) throws IOException {/** 接收客户端发送的数据*///1.创建服务器端DatagramSocket,指定端口DatagramSocket socket=new DatagramSocket(8800);//2.创建数据报,用于接收客户端发送的数据byte[] data =new byte[1024];//创建字节数组,指定接收的数据包的大小System.out.println("****服务器启动,等待客户端连接****");int count=1;while(true) {DatagramPacket packet = new DatagramPacket(data, data.length);socket.receive(packet);InetAddress address = packet.getAddress(); // 接收到哪个ip发来的数据int port = packet.getPort(); // 对方使用哪个端口发送的if (All.clientMap.containsKey(address.getHostAddress()+"_"+port)) {System.out.println("客户端已经存在");continue;}All.clientMap.put(address.getHostAddress()+"_"+port, null);UDPServerThread serverThread = new UDPServerThread(packet, socket);serverThread.start();System.out.println("客户端数量:" + count++);}}
}
3.维护每个客户端连接
package cn.com.zh.udp;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class UDPServerThread extends Thread{DatagramPacket packet;DatagramSocket socket;public UDPServerThread(DatagramPacket packet, DatagramSocket socket) {super();this.packet = packet;this.socket = socket;}@Overridepublic void run(){try {//获取客户端信息byte[] data = packet.getData();String info1 = new String(data, 0, packet.getLength());System.out.println("我是服务器,客户端说:" + info1);//响应客户端InetAddress address = packet.getAddress(); // 接收到哪个ip发来的数据int port = packet.getPort(); // 对方使用哪个端口发送的while (true) {// TODO do businessThread.sleep(3000);byte[] data1 = ("欢迎您!" + System.currentTimeMillis()).getBytes();DatagramPacket packet1 = new DatagramPacket(data1, data1.length, address, port);socket.send(packet1);}}catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {throw new RuntimeException(e);}}
}