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?
Trả lời
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();
}
}
}
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
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. –
- 1. Sử dụng lại các ổ cắm web giữa các trang?
- 2. Tôi có thể đóng và mở lại ổ cắm không?
- 3. Cách nhanh nhất để liên lạc giữa C++ và C#
- 4. C# liên lạc giữa các luồng
- 5. Giao tiếp giữa hai máy tính bằng cách sử dụng ổ cắm python
- 6. Sự khác nhau giữa ống và ổ cắm là gì?
- 7. Thử nghiệm đơn vị C# bằng cách sử dụng các ổ cắm
- 8. Sử dụng Java 6, trên linux làm cách nào tôi có thể đảm bảo sử dụng ổ cắm ipv4?
- 9. Java, ổ cắm, BufferedReader, và readline treo ... :(
- 10. Ổ cắm Java: Tôi có thể viết một máy chủ TCP với một luồng không?
- 11. (Làm cách nào) Tôi có thể tìm loại ổ cắm từ bộ mô tả ổ cắm không?
- 12. Tại sao Ổ cắm web không sử dụng SOAP?
- 13. Ổ cắm giữa các máy tính
- 14. Đường ống giữa các ổ cắm
- 15. Xác định giữa ổ cắm và fd
- 16. liên lạc giữa các servlet từ xa
- 17. Ổ cắm TLS-PSK Java
- 18. Ổ cắm Php và các luồng
- 19. Ổ cắm Java và các kết nối bị rơi
- 20. liên lạc giữa các quy trình trong python
- 21. Tôi có thể sử dụng cùng một tăng :: asio :: io_service cho nhiều ổ cắm nghe không?
- 22. C# - WCF - liên lạc giữa các quá trình
- 23. Cách nhận Số liên lạc cụ thể bằng cách sử dụng Id liên hệ
- 24. Không thể đọc từ ổ cắm (treo)
- 25. Tôi có thể chuyển đổi giữa .doc và .docx bằng cách sử dụng PHP không?
- 26. Có thể tìm thấy các ổ cắm tmux hiện đang được sử dụng không?
- 27. Cách liên lạc giữa các Dịch vụ Windows
- 28. Ổ cắm TCP và UDP có thể sử dụng cùng một cổng không?
- 29. Ổ cắm thô trong java
- 30. Java - Ổ cắm treo lạ?
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
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
@ 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). –