更具體地說,如果一臺計算機有一個服務器(一個java.net.ServerSocket
實例),我可以使用C#System.Net.Sockets.Socket
實例連接到它嗎?我可以使用套接字在Java和C#之間進行通信嗎?
回答
主要問題是您需要非常小心的發送和接收數據的編碼。這是一對一起工作的程序。 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();
}
}
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();
}
}
}
gj它的工作,節省了大量的時間,試圖找出一個簡單的故事 – azuneca 2015-09-08 08:03:47
作爲一個有希望的有趣的一邊,Java確實有一個無符號數字原語,但它是16位,而不是8.我們以前最喜歡的char是一個無符號的16位號碼畢竟。這就是爲什麼[Character.toChars(int)](https://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#toChars%28int%29)返回一個字符數組,由於整個UTF-16 shenanigans的東西。 – 2016-02-28 08:10:17
- 1. 使用node-ipc和unix套接字在NodeJS和C之間進行通信
- 2. 我可以在活動和服務之間使用greenrobot EventBus進行通信嗎?
- 3. 進程間通信是套接字通信可靠協議嗎?
- 4. 通過web套接字在javascript和C++代碼之間進行通信?
- 5. 線程之間可以通過LINX通信進行通信嗎?
- 6. 在C++和C#之間進行通信?
- 7. 是否可以使用Unix套接字在C應用程序和Java應用程序之間創建通信?
- 8. 我們可以使用EventObject在不同的JVM之間進行通信嗎?
- 9. 使用可序列化對象的java套接字和android之間的通信
- 10. 我可以使用套接字將JAVA與Javascript通信到Javascript嗎?
- 11. 我可以使用Microsoft AppFabric緩存在PHP和ASP.NET之間進行通信:
- 12. 在C中使用套接字進行通信的問題#
- 13. 我應該在套接字和另一個套接字之間使用Thread.Sleep嗎?
- 14. 在Android手機和使用java的TCP之間進行通信
- 15. Java Web應用程序和C++服務器之間的套接字通信
- 16. 如何使用XML-RPC在Python和C#之間進行通信?
- 17. 可以使用anymote協議在兩個android設備之間進行通信嗎?
- 18. 在Java SE和Java EE應用程序之間進行通信
- 19. 通過本地主機在C#和網站之間進行套接字/通知
- 20. 在Java類之間進行通信
- 21. 兩個Android手機之間可以進行通信嗎?
- 22. PHP和C++之間的安全套接字通信
- 23. Python 3套接字和QTcpsocket之間的通信失敗(C++)
- 24. C和python代碼之間的套接字通信
- 25. C#和Flex之間的套接字通信問題
- 26. Google protobuf可以用於Android中C和Java服務之間的通信嗎?
- 27. 如何使用套接字在服務器和客戶端之間進行通信? [C]
- 28. 我可以在Visual C++中使用Indy套接字嗎?
- 29. 通過管道在C++和c#之間進行通信
- 30. 兩臺計算機之間使用python套接字進行通信
是。他們歸結爲讀取字節,這是語言中立(減去有趣的警告,即Java沒有像C#那樣的無符號'字節')。 – pickypg 2013-02-12 02:28:40
是的,看看這個答案(由藍色基因):http://stackoverflow.com/questions/5999180/sockets-send-strings-from-java-to-c – damix911 2013-02-12 02:31:29
@ damix911你可以鏈接目錄到答案,例如[Blue Gene's answer](http://stackoverflow.com/a/6001758/438992)。 – 2013-02-12 02:56:34