主要问题是您需要非常小心发送和接收的数据的编码。这是一对可以协同工作的程序。C#客户端发送字符串,方法是首先发送其长度为整数,然后发送字符串本身的字节。Java服务器读取长度,然后读取消息并将输出打印到控制台。然后编写回显消息,计算其长度,提取字节并将其发送回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(); }}AC#客户端:
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(); } }}


