अधिक विशेष रूप से, यदि किसी कंप्यूटर के पास सर्वर है (java.net.ServerSocket
उदाहरण) क्या मैं इसे C# System.Net.Sockets.Socket
इंस्टेंस का उपयोग करके कनेक्ट कर सकता हूं?क्या मैं सिर्फ सॉकेट का उपयोग कर जावा और सी # के बीच संवाद कर सकता हूं?
उत्तर
मुख्य मुद्दा यह है कि आपको भेजे गए डेटा के एन्कोडिंग के साथ आपको बहुत सावधान रहना होगा। यहां कार्यक्रमों की एक जोड़ी है जो एक साथ काम करती है। सी # क्लाइंट एक स्ट्रिंग भेजता है, पहले इसकी लंबाई को पूर्णांक के रूप में भेजकर, और उसके बाद स्ट्रिंग के बाइट भेजता है। जावा सर्वर लंबाई को पढ़ता है, फिर संदेश पढ़ता है और कंसोल पर आउटपुट प्रिंट करता है। फिर एक गूंज संदेश लिखता है, इसकी लंबाई की गणना करता है, बाइट निकालता है और इसे वापस सी # क्लाइंट में भेजता है। क्लाइंट लंबाई, संदेश और एक आउटपुट प्रिंट करता है। सभी bitwise सामान से बचने के लिए एक तरीका होना चाहिए, लेकिन ईमानदारी से मैं इस सामान के साथ थोड़ा सा जंगली हूँ, खासकर जावा पक्ष पर।
एक जावा सर्वर:
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();
}
}
एक सी # ग्राहक:
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();
}
}
}
जीजे ने काम किया, एक आसान कहानी जानने के लिए बहुत समय बचाया – azuneca
एक आशाजनक रूप से दिलचस्प एक तरफ के रूप में, जावा के पास एक हस्ताक्षरित संख्या आदिम है, लेकिन यह 16 बिट है, 8 नहीं। हमारा पुराना पसंदीदा char एक हस्ताक्षरित 16-बिट है सब के बाद संख्या। यही कारण है कि [Character.toChars (int)] (https://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#toChars%28int%29) वर्णों की एक सरणी देता है, पूरे यूटीएफ -16 शेनानिगन्स सामान के कारण। –
हां। वे बाइट पढ़ने के लिए उबालते हैं, जो भाषा तटस्थ होते हैं (कमजोर चेतावनी से कम है कि जावा ने बाइट की तरह सी # को हस्ताक्षर नहीं किया है)। – pickypg
हां, इस उत्तर को देखें (ब्लू जीन द्वारा एक): http://stackoverflow.com/questions/5999180/sockets-send-strings-from-java-to-c – damix911
@ damix911 आप निर्देशिका को लिंक कर सकते हैं उत्तर, उदाहरण के लिए, [ब्लू जीन का जवाब] (http://stackoverflow.com/a/6001758/438992)। –