• Unity与java后端UDP通信


    1. unity客户端代码:

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using System.Net.Sockets;
    5. using System.Net;
    6. using System.Threading;
    7. using System.Text;
    8. using System;
    9. public class Udp : MonoBehaviour
    10. {
    11. static Socket client; // client
    12. static Thread reciveThread;
    13. static Thread sendThread;
    14. static EndPoint server;
    15. void Start()
    16. {
    17. server = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8800);
    18. client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    19. client.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6666));//绑定端口号和IP
    20. reciveThread = new Thread(ReciveMsg);//开启接收消息线程
    21. reciveThread.Start();
    22. sendThread = new Thread(()=>SendMsg("hello, first time"));//开启发送消息线程
    23. sendThread.Start();
    24. }
    25. // Update is called once per frame
    26. void Update()
    27. {
    28. if (Input.GetKeyDown(KeyCode.M)) {
    29. String msg = "time:" + Time.deltaTime;
    30. SendMsg(msg);
    31. }
    32. }
    33. void OnDestroy() {
    34. client.Close();
    35. }
    36. /// <summary>
    37. /// 向特定ip的主机的端口发送数据报
    38. /// </summary>
    39. static void SendMsg(String msg)
    40. {
    41. client.SendTo(Encoding.UTF8.GetBytes(msg), server);
    42. }
    43. /// <summary>
    44. /// 接收发送给本机ip对应端口号的数据报
    45. /// </summary>
    46. static void ReciveMsg()
    47. {
    48. while (true)
    49. {
    50. Thread.Sleep(100);
    51. EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号
    52. byte[] buffer = new byte[1024];
    53. int length = client.ReceiveFrom(buffer, ref point);//接收数据报
    54. string message = Encoding.UTF8.GetString(buffer,0,length);
    55. Debug.Log(message);
    56. }
    57. }
    58. }

    2. java服务端代码:

    1. package cn.com.zh.udp;
    2. import cn.com.zh.qmcq.All;
    3. import java.io.IOException;
    4. import java.net.DatagramPacket;
    5. import java.net.DatagramSocket;
    6. import java.net.InetAddress;
    7. public class UDPServer {
    8. public static void main(String[] args) throws IOException {
    9. /*
    10. * 接收客户端发送的数据
    11. */
    12. //1.创建服务器端DatagramSocket,指定端口
    13. DatagramSocket socket=new DatagramSocket(8800);
    14. //2.创建数据报,用于接收客户端发送的数据
    15. byte[] data =new byte[1024];//创建字节数组,指定接收的数据包的大小
    16. System.out.println("****服务器启动,等待客户端连接****");
    17. int count=1;
    18. while(true) {
    19. DatagramPacket packet = new DatagramPacket(data, data.length);
    20. socket.receive(packet);
    21. InetAddress address = packet.getAddress(); // 接收到哪个ip发来的数据
    22. int port = packet.getPort(); // 对方使用哪个端口发送的
    23. if (All.clientMap.containsKey(address.getHostAddress()+"_"+port)) {
    24. System.out.println("客户端已经存在");
    25. continue;
    26. }
    27. All.clientMap.put(address.getHostAddress()+"_"+port, null);
    28. UDPServerThread serverThread = new UDPServerThread(packet, socket);
    29. serverThread.start();
    30. System.out.println("客户端数量:" + count++);
    31. }
    32. }
    33. }

    3.维护每个客户端连接

    1. package cn.com.zh.udp;
    2. import java.io.IOException;
    3. import java.net.DatagramPacket;
    4. import java.net.DatagramSocket;
    5. import java.net.InetAddress;
    6. public class UDPServerThread extends Thread{
    7. DatagramPacket packet;
    8. DatagramSocket socket;
    9. public UDPServerThread(DatagramPacket packet, DatagramSocket socket) {
    10. super();
    11. this.packet = packet;
    12. this.socket = socket;
    13. }
    14. @Override
    15. public void run(){
    16. try {
    17. //获取客户端信息
    18. byte[] data = packet.getData();
    19. String info1 = new String(data, 0, packet.getLength());
    20. System.out.println("我是服务器,客户端说:" + info1);
    21. //响应客户端
    22. InetAddress address = packet.getAddress(); // 接收到哪个ip发来的数据
    23. int port = packet.getPort(); // 对方使用哪个端口发送的
    24. while (true) {
    25. // TODO do business
    26. Thread.sleep(3000);
    27. byte[] data1 = ("欢迎您!" + System.currentTimeMillis()).getBytes();
    28. DatagramPacket packet1 = new DatagramPacket(data1, data1.length, address, port);
    29. socket.send(packet1);
    30. }
    31. }catch (IOException e) {
    32. e.printStackTrace();
    33. } catch (InterruptedException e) {
    34. throw new RuntimeException(e);
    35. }
    36. }
    37. }

  • 相关阅读:
    基因对静息态脑功能网络的影响
    「Python实用秘技15」pandas中基于范围条件进行表连接
    绑定支付卡表单页面html页面前端源码
    Metasploit入门教程(非常详细)从零基础入门到精通,看完这一篇就够了!
    使用Spark实现推主机群Hive数据到租户集群Hive的高性能Hive2Hive数据集成【Java】需编写JDBC连接Hive解析元数据
    【JUC系列】Fork/Join框架之概览
    Kernel Memory 入门系列:快速开始
    为什么都在说实时数据传输?
    HLS优化设计(一)
    使用定时器获取转速信息(PWM频率)
  • 原文地址:https://blog.csdn.net/kaiyuantao/article/details/134268917