gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:27:47 24 4
gpt4 key购买 nike

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

最佳答案

主要问题是您需要非常小心地处理您发送和接收的数据的编码。这是一对协同工作的程序。 C# 客户端发送一个字符串,首先发送它的整数长度,然后发送字符串本身的字节。 Java 服务器读取长度,然后读取消息并将输出打印到控制台。然后组成回显消息,计算其长度,提取字节并将其发送回 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();
}
}

C# 客户端:

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();
}
}
}

关于c# - 我可以仅使用套接字在 Java 和 C# 之间进行通信吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14824491/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com