不完整的消息(C#TCP/IP客户端)
首先,我绝对不是一个网络程序员。我尝试做的是在Java服务器和C#client之间进行非常简单的TCP/IP通信 Java服务器:不完整的消息(C#TCP/IP客户端),c#,java,sockets,networking,tcp,C#,Java,Sockets,Networking,Tcp,首先,我绝对不是一个网络程序员。我尝试做的是在Java服务器和C#client之间进行非常简单的TCP/IP通信 Java服务器: public void run(){ try { // Open server socket _server = new ServerSocket(SERVER_PORT); _client = _server.accept(); System.out.println("ComInte
public void run(){
try {
// Open server socket
_server = new ServerSocket(SERVER_PORT);
_client = _server.accept();
System.out.println("ComInterface: client connected.");
// Wait for a client data output stream
while(true){
// Receive message from client
BufferedReader is =
new BufferedReader(new InputStreamReader(_client.getInputStream()));
msg = is.readLine();
// Process message
if(msg!=null){
System.out.println("ComInterface: Message Received : <" + msg + ">.");
processMessage(msg); // Independant method
}
else{
System.out.println("ComInterface: client closed connection.");
_client.close();
_client = _server.accept();
System.out.println("ComInterface: client connected.");
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void sendMessage(String msg){
try {
// Out stream
DataOutputStream os = new DataOutputStream(_client.getOutputStream());
os.writeBytes((String)(msg+"\n"+(char)13));
os.flush();
System.out.println("ComInterface: Message <" + msg + "> sent");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
而不是例如
C#: Message "{"sender":"Bob","recipient":[1,2,3]}"
我有点困惑,我需要一些帮助来解决这个问题。多谢各位 一条消息(我的意思是任何数据)通过套接字发送时,会被分成几个数据包。
打印每个收到的数据包时,您不会看到整个消息
您应该定义消息结尾字符串(类似“#”)。在收到此序列之前,您将继续连接收到的消息
这就是会话协议(即运行在TCP之上的协议)的作用
希望这有帮助
您好,Calil看看这个例子 Java TCP服务器
import java.net.*;
import java.io.*;
public class TcpServer
{
public static void main(String h[])
{
try
{
ServerSocket serverSocket = new ServerSocket(1100);
Socket socket = serverSocket.accept();
System.out.println("Client Accepted");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("Received: " + bufferedReader.readLine());
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
printWriter.println("Hello Theo. Welcome to socket programming.");
} catch (Exception e)
{
System.out.println(e);
}
}
}
C#TCP客户端
using System;
using System.IO;
using System.Net.Sockets;
class Program
{
static void Main(string[] args)
{
try
{
var client = new TcpClient("localhost", 1100);
var stream = client.GetStream();
var streamWriter = new StreamWriter(stream);
streamWriter.WriteLine("My name is Theo");
streamWriter.Flush();
var streamReader = new StreamReader(stream);
Console.WriteLine("Received: " + streamReader.ReadLine());
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Console.WriteLine("Press a key to continue.");
Console.ReadKey();
}
}
是面向流的连接,而不是面向消息的连接。它没有消息的概念。当您写出序列化字符串时,它只看到一个无意义的字节序列。TCP可以自由地将该流分解为多个片段,它们将在客户端以片段大小的块接收。由您在另一端重新构建整个消息
在您的场景中,通常会发送消息长度前缀。这样,客户机首先读取长度前缀,这样就可以知道传入消息的大小
我会认真考虑使用谷歌之类的东西作为声明消息的好方法,然后用大小前缀选项流。很好的一点是,您定义一次消息集,然后使用可用的消息来自动生成C++、爪哇、C等代码。这将有助于在不同语言之间使用一致的消息集
import java.net.*;
import java.io.*;
public class TcpServer
{
public static void main(String h[])
{
try
{
ServerSocket serverSocket = new ServerSocket(1100);
Socket socket = serverSocket.accept();
System.out.println("Client Accepted");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("Received: " + bufferedReader.readLine());
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
printWriter.println("Hello Theo. Welcome to socket programming.");
} catch (Exception e)
{
System.out.println(e);
}
}
}
using System;
using System.IO;
using System.Net.Sockets;
class Program
{
static void Main(string[] args)
{
try
{
var client = new TcpClient("localhost", 1100);
var stream = client.GetStream();
var streamWriter = new StreamWriter(stream);
streamWriter.WriteLine("My name is Theo");
streamWriter.Flush();
var streamReader = new StreamReader(stream);
Console.WriteLine("Received: " + streamReader.ReadLine());
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Console.WriteLine("Press a key to continue.");
Console.ReadKey();
}
}