In a client/server architecture it is not required that client and server are implemented in the same programming language. They usually communicate by sending raw data via network sockets. So you can choose the technology for each component separately, depending on your requirements, skillset and personal preferences. An exception would be when you want to use some library for netcode abstraction which isn't available for both languages you would like to use.
Only sending clients the data they need and only receiving their input whileand calculating the game mechanics on the server while only receiving the input is usually a good approach. This is called an authoritative server and it is the best way to prevent cheating. However, any actions the client performs locally should be performed without waiting for a confirmation to make the game appear smoothly regardless of the network latency.