2013-02-12 22 views
5

Cụ thể hơn, nếu máy tính có máy chủ (ví dụ java.net.ServerSocket) tôi có thể kết nối với nó bằng cách sử dụng phiên bản C# System.Net.Sockets.Socket không?Tôi có thể liên lạc giữa Java và C# bằng cách sử dụng các ổ cắm không?

+9

Yes. Họ đun sôi xuống để đọc byte, đó là ngôn ngữ trung lập (trừ đi những lời thú vị rằng Java không có unsigned 'byte' như C#). – pickypg

+1

Có, hãy xem câu trả lời này (câu trả lời của Blue Gene): http://stackoverflow.com/questions/5999180/sockets-send-strings-from-java-to-c – damix911

+0

@ damix911 Bạn có thể liên kết thư mục với câu trả lời, ví dụ: [Câu trả lời của Blue Gene] (http://stackoverflow.com/a/6001758/438992). –

Trả lời

23

Vấn đề chính là bạn cần phải rất cẩn thận với việc mã hóa dữ liệu bạn gửi và nhận. Đây là một cặp chương trình hoạt động cùng nhau. Máy khách C# gửi một chuỗi, bằng cách đầu tiên gửi chiều dài của nó như là một số nguyên, và sau đó gửi các byte của chuỗi chính nó. Máy chủ Java đọc độ dài, sau đó đọc thông báo và in đầu ra cho bàn điều khiển. Sau đó soạn một thông điệp echo, tính toán độ dài của nó, trích xuất các byte và gửi nó trở lại C# client. Máy khách đọc chiều dài, tin nhắn và in ra một đầu ra. Nên có một cách để tránh tất cả các công cụ bitwise, nhưng thành thật mà nói tôi là một chút gỉ với công cụ này, đặc biệt là ở phía Java.

Một Java server:

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

Một C# khách hàng:

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

gj hoạt động của nó, tiết kiệm rất nhiều thời gian cố gắng để tìm ra một câu chuyện dễ dàng – azuneca

+0

Là một hy vọng thú vị sang một bên, Java không có một số nguyên unsigned, nhưng nó là 16 bit, không 8. char yêu thích cũ của chúng tôi là một unsigned 16-bit số sau khi tất cả. Đây là lý do tại sao [Character.toChars (int)] (https://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#toChars%28int%29) trả về một mảng các ký tự, do toàn bộ các công cụ shenanigans UTF-16. –

Các vấn đề liên quan