更具体地说,如果一台计算机有一个服务器(一个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