Giter Site home page Giter Site logo

riptidenetworking / riptide Goto Github PK

View Code? Open in Web Editor NEW
1.0K 31.0 139.0 8.25 MB

Lightweight C# networking solution for multiplayer games.

Home Page: https://riptide.tomweiland.net

License: MIT License

C# 100.00%
udp rudp multiplayer networking csharp unity unity3d multiplayer-games gamedev games

riptide's People

Contributors

bilnord avatar ebosseck avatar gohan500 avatar mograine avatar nachtmeer avatar rudythedev avatar titusio avatar tom-weiland avatar xzippyzachx avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

riptide's Issues

Apple review team can not connect with the server

Publishing game with RiptideNetworking for AppStore Connect review will be always rejected because their team can not connect with the server (in my case to dedicated server and the connection is necessary to use the game). My dedicated server is correctly configured including server firewall. Reffering to conversations with other developers it looks like their review center firewall deny UDP. The only solution to this problem in my opinion is to make TCP transport for Riptide as a fallback server to successfuly publish the game on AppStore.

Server.ClientConnected not being called

I'm pretty sure I'm doing this right. I use the Unity Package Manager version of Riptide 0.8.2.
My code to register the callback:

server = new Server(new RudpServer());
server.ClientConnected += NewClientConnected;

My code to start the server:

RiptideLogger.Initialize(Debug.Log, false);

server.Start(port, maxPlayers);

Finally, my code that executes when a new client joins

private void NewClientConnected(object sender, ServerClientConnectedEventArgs e)
{
	Debug.Log("connected");
	ServerSend.SpawnPlayer(e.Client.Id, Vector3.up * 3, Quaternion.identity);
}

And this is the console:
image
I assume that this is a bug that have been introduced recently because it used to work in my previous projects which used Riptide 0.5.0, or it can be just me being stupid idk.

Add the ability to include custom data on server kicks.

In Riptide v1.2.0, you added the ability to include custom data in connection attempts. I think it would be very useful to be able to include custom data when the server kicks a client. For example, to include a reason for the kick.

Nuget packages

I use Monogame framework and this networking solution works with it. I was wondering for the pure c# stuff you could release the network solution as a nuget package. Would make adding it to console apps and monogame apps alot easier.

No way to get client's IP address

I think there should be a field in the IConnectionInfo with the player's IP address, it could be useful for some custom debug messages.

Ability to have an asynchronous callback on reliable messages

The ability to have an asynchronous callback form a reliable message when it successfully arrives. This would allow you to do something that is only able to be done after a message is successfully received. The example I had was to send a message to spawn the player and then only send the message to spawn the players items after the player message was successfully received.

"NullReferenceException" before the first connection attempt.

With or without server, before the first connection attempt console is spammed with errors. After - it's ok.

After clients are connected everything seems to work fine...

Custom project (based on your youtube tutorial).

All breaking code changes are applied.
Installed with Package Manager.

On client, without server:
2022-10-24 18_31_50-Game

On client, with server:
2022-10-24 18_33_05-Game

On server, throw error after client connects, for each client:
2022-10-24 18_46_45-Window

"No ack received" Warnings When All Messages Should Be Delivered (On Localhost)

Currently only using a lan version of the Game.

Having an issue with spawning objects, whenever the player shoots and spawns a projectile I receive a No Ack received warning sometimes it is every projectile sometimes it is just one projectile.

In uncommon cases I'll receive a few no ack warnings then the host will be kicked from the game and either clients will still be on the server or the clients will also be kicked, the host will also not be able to host or join a server without restarting their game first.

Most of the warnings only show up on the host client but sometimes the client with the weaker connection also gets the warnings

Images for the warnings
image
image

Images for the code
image
image

Inform that the IP address is invalid

In games where the user can enter any IP address to join to, it would be useful to know if the IP entered is invalid. That way, Devs can show the users that the IP entered was invalid.

For ways you can do this: you could return false out of the Connect() method if its invalid, add a parameter to the FailedConnection event.

Or maybe there is a more cleaner approach.

shouldAutoRelay not working

I don't know how to explain it further: When setting shouldAutoRelay to true in the Message.Create function nothing changes.

Socket.DualMode throws System.PlatformNotSupportedException on the Mac OS

Hey, I tried to run some code on the Mac OS and it's giving me the aforementioned exception.

Unhandled exception. System.PlatformNotSupportedException: This platform does not support packet information for dual-mode sockets.  If packet information is not required, use Socket.Receive.  If packet information is required set Socket.DualMode to false.
   at System.Net.Sockets.SocketPal.CheckDualModeReceiveSupport(Socket socket)
   at System.Net.Sockets.Socket.ReceiveFrom(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, EndPoint& remoteEP)
   at RiptideNetworking.Transports.RudpTransport.RudpListener.Receive()
   at System.Threading.Thread.StartCallback()

Is it just not compatible with the Mac OS? How trivial would it be to disable DualMode?

Event handlers not working & messages are not sending/receiving

Hi,

I am using latest release [v1.2.0]. I have the basic code below for client:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RiptideNetworking;
using RiptideNetworking.Utils;
public enum ServerToClientId : ushort
{
playerSpawned = 1,
}
public enum ClientToServerId : ushort
{
name = 1,
}
internal class NetworkManager
{
private static NetworkManager _singleton;
public static NetworkManager Singleton
{
get => _singleton;
set
{
if (_singleton == null)
_singleton = value;
else if (_singleton != value)
{
Console.WriteLine($"{nameof(NetworkManager)} instance already exists, destroying duplicate!");
Console.WriteLine(value);
}
}
}
public Client Client { get; set; }
private string ip = "127.0.0.1";
private ushort port = 23787;
private void Initialize()
{
Singleton = this;
}
public void Start()
{
RiptideLogger.Initialize(Console.WriteLine, Console.WriteLine, Console.WriteLine, Console.WriteLine, false);
Client = new Client();
Client.Connected += DidConnect;
Client.ConnectionFailed += FailedToConnect;
Client.ClientDisconnected += PlayerLeft;
Client.Disconnected += DidDisconnect;
Client.ClientConnected += DidConnect;
}
private void FixedUpdate()
{
Client.Tick();
}
private void OnApplicationQuit()
{
Client.Disconnect();
}
public void Connect()
{
Client.Connect($"{ip}:{port}");
}
private void DidConnect(object sender, EventArgs e)
{
//UIManager.Singleton.SendName();
Console.WriteLine("@DidConnect");
}
private void FailedToConnect(object sender, EventArgs e)
{
Console.WriteLine("@failedtoconnect");
}
private void PlayerLeft(object sender, ClientDisconnectedEventArgs e)
{
Console.WriteLine("@PlayedLeft");
}
private void DidDisconnect(object sender, EventArgs e)
{
Console.WriteLine("@DidDisconnect");
}
}

None of the event handlers are working:

    Client.Connected += DidConnect;
    Client.ConnectionFailed += FailedToConnect;
    Client.ClientDisconnected += PlayerLeft;
    Client.Disconnected += DidDisconnect;
    Client.ClientConnected += DidConnect;

I am not sure if I am doring anything wrong. Please help.

Connecting to non-server devices

Are there any consequences to connectiong to a device that hasn't got anything to do with my app? Eg. if I would connect to my TV through code would my device show up on it?

No handler method error despite handler being defined.

In my project, I have 2 packets being sent between the server and client simply to share some information about the state of the game. Both the packets are being sent, and on the server side the packet is being handled (the same error does not occur, and I have Log statements during the handler that are being sent). However, on the client side, all I'm getting is this error message:
No client-side handler method found for message ID 2!
It's worth mentioning that I have the server logic and the client logic defined in the same unity project, switching between them by using the "Server Build" functionality in Unity's build settings. I have both the Server-Side and Client-Side Packet Handlers in one script however in early versions they were both in the client and server scripts respectively and it was still broken. Here is the code;

using System.Collections;
using UnityEngine;
using RiptideNetworking;

public class PacketHandlers : MonoBehaviour
{
    [MessageHandler((ushort)NetworkCommons.PacketType.SendingClientInfo)] //PacketType.SendingClientInfo is 1
    private static void RecieveClientInfo(ushort fromClientId, Message message)
    {
       //Logic
    }

    [MessageHandler((ushort)NetworkCommons.PacketType.RecievingServerInfo)] //PacketType.RecievingServerInfo is 2
    private static void ReceivingServerInfo(ushort fromClientId, Message message)
    {
        //Logic
    }
}

I am aware that this error has been brought up before but no actual solution was came to in that thread, so hopefully we can come up with a public solution to this error to kill it once and for all.

A way to deny connections on the server

I don’t know if this is already a feature, but I was wondering if there was a way for the server to deny incoming connections. For example everyone joins the server in the “lobby” and then when the game starts nobody can join at this point until the game finishes like in among us lol. So the server will keep the clients that connected before the game starts but will deny any new incoming connections.

Usage of DateTime.UtcNow caused issues on IOS builds

Hey, thought I'd share since I spent an inordinate amount of time scratching my head over this one 😅

First wanted to say thanks for sharing this library! Riptide is absolutely fantastic.

So the heartbeat mechanism uses DateTime.UtcNow to check whether the timeout period has elapsed. I'm developing for cross-platform so it always behaved very nicely on my PC and Android devices, however when it came to IOS builds I ran into sporadic connection issues where players would lose their connections.

I'm not sure exactly how DateTime works on IOS devices, for my "Round timer" component I have to do (TimeSpawn.FromMinutes(3) - timeLeft) for IOS wheras using only timeLeft seems to be equivalent on PC and Android. Another unfortunate point of frustration when it comes to the apple developer experience.

I solved it by simply removing the heartbeat mechanic entirely and handling it on the application side. But might be useful to take a look at within the library.

Encrypting Traffic

Currently the data is sent unencrypted between the client and server which is fine for most use cases, however it could prove slightly problematic for certain applications such as chat messages etc

How could one integrate encryption with Riptide, would it be on the Message layer or would it be wrapping the TCP socket?

Sending data with more than 1250 bytes

I am creating a player-hosted multiplayer survival game, so there is a lot of stuff that isn't stored on the server, but on the clients. because of this when the game gets saved I need to send a relatively big JSON savefile from every client to the server. Currently I need to break it down into several messages, because a message can't have more than 1250 bytes. However this is obviously not ideal, and as the savefile gets bigger because there is more data that needs to be saved It will get more and more complicated. So I wanted to ask: is there a possibility to send bigger chunks of data with riptide? and if this isn't possible: is there a reason for it not to be possible?

Multiple TCP clients go offline quickly, which will lead to errors.

Multiple TCP clients go offline quickly, which will lead to errors.
eg:
I don't think it's reasonable to deal with it here
private void Heartbeat()
{
lock (clients)
{
foreach (RudpConnection client in clients.Values)
if (client.HasTimedOut)
timedOutClients.Add(client.RemoteEndPoint);
}

        foreach (IPEndPoint clientEndPoint in timedOutClients)
            HandleDisconnect(clientEndPoint); // Disconnect the clients

        timedOutClients.Clear();
    }

Error on port parse

I get an error while trying to join a server: (CLIENT): Invalid host address '192.168.1.180​:6112'! IP and port should be separated by a colon, for example: '127.0.0.1:7777'.

After a bit of debugging I found out the ushort.TryParse() segment gives error.

if (!IPAddress.TryParse(ipString, out ip) || !ushort.TryParse(portString, out port))
{
  RiptideLogger.Log(LogType.error, LogName, $"Invalid host address '{hostAddress}'! IP and port should be separated by a colon, for example: '127.0.0.1:7777'.");
  port = 0;
  return false;
}

The whole thing is weird, because if you connect with Client.Connect($"192.168.1.180:6112"); it works perfectly fine, so probably this will be an issue with .NET or with something else, but I thought I try here first.

DisconnectedEventArgs is missing from namespace

Trying to implement a DidDisconnect function with a DisconnectedEventArgs argument (as like in the demo scripts) throws a "type or namespace could not be found" error. Could be that the class was not defined in the 1.2.0 build?

LanDiscovery being blocked by windows firewall

Windows firewall appears to be blocking my game using that is using LAN discovery, is there any workaround to this that is not manually letting the game through the firewall? I don’t want users who are not system admins to not be able to use multiplayer. Also, does LAN discovery work on the same machine? Like if I started a client and server instance on the same machine, would they find each other?

iOS builds failing to initialize client dictionary

Connect method in client passes Assembly.GetCallingAssembly(). On PC builds this returns Assembly-CSharp - which causes no issues with dictionary initialization. However, on iOS this returns UnityEngine.CoreModule and no methods are found in this assembly for initializing the client dictionary.

Player ids not getting updated after a player leaves

This problem occurs in the Unity demos with code unchanged. I don't know if it is due to a mistake in the scripts or in the plugin. As far as I know, it seems to be fine in the scripts. So each time a player leaves and joins back, it gets a new id. It's like if when the player left it didn't remove its id from the list. It doesn't feel like it is doing what it is supposed, especially compared to the networking solution made in the tutorial series. Also if the id of the player is about to reach over the maximum of connections allowed, it finally gets the id it is supposed to have. Now, even if it really looks like an error, like something that needs to be fixed, I am not fully sure that it is truly an issue and not just some new way that the code works. But here's the reason why it bothers me: if you try to join on the client while the server is not started and then you start the server, it will show an error and the server will stop working. Here's the error: ArgumentException: An item with the same key has already been added. Key: 1. It seems like it happens because of the id that doesn't get removed when the player leaves or fails to join. Of course, I might be totally wrong. After all, I don't know much about networking. But I thought it was better to report it even if I have doubts. I hope this helps.

Please add a thing that works like a chat room, where players can join and chat!

Ok, I started using Riptide and noticed that this was missing, we can use the chat rooms for online chatting for players, I mean just make a class that handles SendChatMessage(string message), onChatMessageRecived(string messageRecived), onJoinChat(), onLeaveChat(). This will be very useful for users please. Overall this is the best multiplayer solution I ever saw, so I am gonna use this for my games!

Message contains insufficient unread bytes (3) to read type 'int', returning 0!

Hi, I encountered this error when I was testing the demos, Unity-Client and Unity-Server work fine, the problem is when I connect Unity-Client with Console-Server, I get the following error:
image
image
I made no modifications at all, I just opened it and ran it.

UnityEngine.Debug:Log (object)
RiptideNetworking.RiptideLogger:Log (string,string)
RiptideNetworking.Message:GetFloat ()
MessageExtensions:GetVector3 (RiptideNetworking.Message) (at Assets/Scripts/Multiplayer/MessageExtensions.cs:45)
ClientHandle:SpawnPlayer (RiptideNetworking.Message) (at Assets/Scripts/Multiplayer/ClientHandle.cs:10)
NetworkManager:MessageReceived (object,RiptideNetworking.ClientMessageReceivedEventArgs) (at Assets/Scripts/Multiplayer/NetworkManager.cs:110)
RiptideNetworking.Client:OnMessageReceived (RiptideNetworking.ClientMessageReceivedEventArgs)
RiptideNetworking.Client/<>c__DisplayClass37_0:<Handle>b__0 ()
RiptideNetworking.ActionQueue:ExecuteAll ()
NetworkManager:FixedUpdate () (at Assets/Scripts/Multiplayer/NetworkManager.cs:74)```

More Network Metrics

Ability to get a clients throughput and goodput with the server. This would help when debugging issues that might be related to bandwidth.
Also maybe the servers overall throughput and goodput of all the clients added up.

found that when Attempts to send the message,it is error,

 The client is originally logged in, but sendattempts > = maxsendattempts are often used in circular detection. The server directly causes an error. What should be the problem with the thread?

///

Attempts to send the message.
internal void TrySend()
{
if (sendAttempts >= maxSendAttempts)
{
// Send attempts exceeds max send attempts, so give up
//发送尝试次数超过最大发送尝试次数,所以放弃
if (RiptideLogger.IsWarningLoggingEnabled)
{
HeaderType headerType = (HeaderType)data[0];
if (headerType == HeaderType.reliable)
{
#if BIG_ENDIAN
ushort messageId = (ushort)(data[4] | (data[3] << 8));
#else
ushort messageId = (ushort)(data[3] | (data[4] << 8));
#endif
RiptideLogger.Log(LogType.warning, peer.Listener.LogName, $"No ack received for {headerType} message (ID: {messageId}) after {sendAttempts} attempt(s), delivery may have failed!");
}
else
RiptideLogger.Log(LogType.warning, peer.Listener.LogName, $"No ack received for internal {headerType} message after {sendAttempts} attempt(s), delivery may have failed!");
}

            Clear();
            return;
        }

After connecting and disconnection the same Client instance a cupple of times it stops working

Okay, so I have a Cleint client = new Client() and after connecting and disconnecting it for 5 (at least for me it was 5) times, the Client get's bugged and the riptide logger prints this [18:54:32] (CLIENT): Connection to server failed! and [18:54:32] (CLIENT): Connecting to 127.0.0.1:9564... (in this order...), and if I try again, it does the same thing. The server does not receive any packets... You should look into this because it's realy annoying. For now I have to create new instances each time the client connects to a new server. Everything else is working amazingly though :).

Client.ClientDisconnected and Client.Disconnected not working

Hi,

I have the following code in my Start():
Client.Disconnected += DidDisconnect; Client.ClientDisconnected += DidDisconnect; Client.ConnectionFailed += FailedToConnect;

and

private void DidDisconnect(object sender, EventArgs e){ Debug.Log("@DidDisconnect"); }

Client.ClientConnected += DidConnect; works

When server is closed, and client is disconnected, unity debug shows:

(CLIENT): Disconnected from server (initiated remotely).
UnityEngine.Debug:Log (object)
RiptideNetworking.Utils.RiptideLogger:Log (RiptideNetworking.Utils.LogType,string,string)
RiptideNetworking.Transports.RudpTransport.RudpClient:OnDisconnected ()
RiptideNetworking.Transports.RudpTransport.RudpClient:Heartbeat ()
RiptideNetworking.Transports.RudpTransport.RudpClient:b__54_0 (object)
System.Threading._ThreadPoolWaitCallback:PerformWaitCallback ()

However, DidDisconnect is not called at all. Any insight/ideas?

Thank you!

LanDiscovery.SendBroadcast throws SocketException: Access denied

I'm using your network library for my game project. Everything is normal when I develop in window. But when I clone a project to MacOS, I have a problem. It threw exception "socket permission denied" in method SendBoardcast of class LanDiscovery. I think it not have permission for macOS network, although I ran unity as sudo. And I suspect IOS app maybe have this problem.

I'm using MacOS Monterey 12.2.1, and MacBook pro 2021

Client not receiving message if it sends a message on Start() and expects to receive message from Server

Setup:

  1. On client, I have a unity script with Start() that connects to Server and sends a message.
  2. The Server sends a response back to the client
  3. The Client handles the message using [MessageHandler] in the same unity script above.

When client sends the message from Start(), it never receives the Server's response.

Instead if I use a button to send message to server, client receives the message correctly. It seems to me that the Server is sending a response back to client before client has time to setup the [MessageHandler]. Or am I missing something?

Grateful for any insight.

Thank you!

Edit:
I moved the code for Client to send message from Start() into Update(), and use a bool to make sure it's only sent once. This seems to work (i.e. Client receives the response from Server), but it remains unclear why Client won't receive response from Server if it sends messag from Start()

Connection Message not reading back

Hello - loving the framework so far. I'm having an issue with connection messages reading back properly. I get an error when getting parameters: "Message contains insufficient unread bytes (14) to read type 'string', result will be truncated!"

Here's an excerpt of what I'm doing on the client side:

private void StartClient()
{

client = new Client();
client.Connected += DidConnect;
client.ConnectionFailed += FailedToConnect;
client.Disconnected += ServerDidDisconnect;
var message = Message.Create(MessageSendMode.reliable, 5);
message.AddString("Test String");
Debug.Log($"Message {message.WrittenLength}");
client.Connect($"{ipAddress}:{messagePort}", 0, message );
clientRunning = true;

}

On the Server:

private void RemoteDidConnect(object sender, ServerClientConnectedEventArgs e)
{
Debug.Log("Remote Did Connect");
Debug.Log($"Unread: {e.ConnectMessage.UnreadLength}\n" +
$"{e.ConnectMessage.WrittenLength}");
var message = e.ConnectMessage;
Debug.Log($"Test string = {message.GetString()}");
}

Any ideas as to what I am doing incorrectly?
Thanks!

CreateMessageHandlersDictionary method causes a lot of GC when searching many and/or large assemblies

Server.Start and Client.Connect cause major lag since merging PR #52. Clicking the Connect button in the dedicated server demo freezes the client for ~20 seconds.

According to the Unity profiler, the freeze is caused by the CreateMessageHandlersDictionary method allocating ~318MB worth of data, which all needs to be garbage collected.

Since PR #52 changed this method to make it check all assemblies in the current AppDomain (there are well over 100 assemblies in the demo projects) for methods marked with the MessageHandler attribute, it's creating an extremely large list of methods, which causes the excessive GC.

While reverting the change would avoid the freezing, this situation has actually exposed a bigger problem—as codebases grow in size and gain more and more methods, the CreateMessageHandlersDictionary method will take more processing time and cause more GC, which eventually may cause noticeable stutters/freezes similar to what is happening now. It's not technically a bug, but it also isn't a desirable outcome.

The change likely also solved issue #44 (though I haven't confirmed this), in which case reverting it would reintroduce that issue again and it would need to be solved in a different way.

Given this, it may be worthwhile to look into alternatives for using reflection (source generation?) to build the message handler dictionaries.

Message contains insufficient unread bytes (0) to read type 'ushort', returning 0!

It works fine when sending from client to server, but when the server responds I get this on the client...

No client-side handler method found for message ID 0!

... and this on the server...

Message contains insufficient unread bytes (0) to read type 'ushort', returning 0!

Code is from scratch and this here seems pretty straight forward...

public static void Send(ushort clientID, ushort command, string value) => Server.Send(Message.Create(MessageSendMode.reliable, command).AddString(value), clientID);

Any plans for future?

Probably it was already discussed on your Youtube channel, but still.

Do you have any roadmap for the library?
I understand that you want to keep it as basic as possible, but there are some features that might be handy for most of projects.

Change package manager header to "Other"

A quick suggestion for simplicity, since the author's name, is already labeled in the main view the category should be changed to "Other".

Others

  • RiptideNetworking
  • Tweens
  • etc...

Screenshot 2022-01-09 204716

[Suggestion] Allow server to have unlimited client slots

It would be a cool feature if you could set the maxClientCount parameter in the Server.Start method to like 0 and this would mean that the server doesn't have a max client limitation.

This would be pretty useful in some applications. Like if you dont want the server to be a game server.

Scan Local Network for Active Servers

I could really use an option to scan the local network for servers listening on the selected port, or at least an option to ping servers by IP and port, without the long timeout that comes with trying to connect to a server not knowing if it's even online...

Not sure if I'm clear enough but I'm trying to make a game with LAN/WLAN multiplayer that has autodiscovery of available hosts.
If it's possible to do that as is I'd be extremely grateful for any help.

Received sequence IDs gap printed to console with a smooth connection.

"The gap between received sequence IDs was very large" continuously printed to console, even after connection returns to a smooth state. This occurred when I was running a Riptide Client and server on my computer and saved a file in another application which took my computer's resources. The expected result would be to stop printing this and correct the sequence IDs.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.