我可以使用套接字在Java和C#之间进行通信吗?

更具体地说,如果计算机具有服务器( java.net.ServerSocket实例),我可以使用C# System.Net.Sockets.Socket实例连接到它吗?

主要问题是您需要非常小心您发送和接收的数据的编码。 这是一对协同工作的程序。 C#客户端通过首先将其长度作为整数发送,然后发送字符串本身的字节来发送字符串。 Java服务器读取长度,然后读取消息并将输出打印到控制台。 然后编写一个echo消息,计算其长度,提取字节并将其发送回C#客户端。 客户端读取长度,消息并打印输出。 应该有办法避免所有按位的东西,但说实话,我对这些东西有点生疏,特别是在Java方面。

Java服务器:

 import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class JavaSocket { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(4343, 10); Socket socket = serverSocket.accept(); InputStream is = socket.getInputStream(); OutputStream os = socket.getOutputStream(); // Receiving byte[] lenBytes = new byte[4]; is.read(lenBytes, 0, 4); int len = (((lenBytes[3] & 0xff) << 24) | ((lenBytes[2] & 0xff) << 16) | ((lenBytes[1] & 0xff) << 8) | (lenBytes[0] & 0xff)); byte[] receivedBytes = new byte[len]; is.read(receivedBytes, 0, len); String received = new String(receivedBytes, 0, len); System.out.println("Server received: " + received); // Sending String toSend = "Echo: " + received; byte[] toSendBytes = toSend.getBytes(); int toSendLen = toSendBytes.length; byte[] toSendLenBytes = new byte[4]; toSendLenBytes[0] = (byte)(toSendLen & 0xff); toSendLenBytes[1] = (byte)((toSendLen >> 8) & 0xff); toSendLenBytes[2] = (byte)((toSendLen >> 16) & 0xff); toSendLenBytes[3] = (byte)((toSendLen >> 24) & 0xff); os.write(toSendLenBytes); os.write(toSendBytes); socket.close(); serverSocket.close(); } } 

AC#客户端:

 using System; using System.Net; using System.Net.Sockets; namespace CSharpSocket { class MainClass { public static void Main (string[] args) { string toSend = "Hello!"; IPEndPoint serverAddress = new IPEndPoint(IPAddress.Parse("192.168.0.6"), 4343); Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); clientSocket.Connect(serverAddress); // Sending int toSendLen = System.Text.Encoding.ASCII.GetByteCount(toSend); byte[] toSendBytes = System.Text.Encoding.ASCII.GetBytes(toSend); byte[] toSendLenBytes = System.BitConverter.GetBytes(toSendLen); clientSocket.Send(toSendLenBytes); clientSocket.Send(toSendBytes); // Receiving byte[] rcvLenBytes = new byte[4]; clientSocket.Receive(rcvLenBytes); int rcvLen = System.BitConverter.ToInt32(rcvLenBytes, 0); byte[] rcvBytes = new byte[rcvLen]; clientSocket.Receive(rcvBytes); String rcv = System.Text.Encoding.ASCII.GetString(rcvBytes); Console.WriteLine("Client received: " + rcv); clientSocket.Close(); } } }