Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不完整的消息(C#TCP/IP客户端)_C#_Java_Sockets_Networking_Tcp - Fatal编程技术网

不完整的消息(C#TCP/IP客户端)

不完整的消息(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

首先,我绝对不是一个网络程序员。我尝试做的是在Java服务器和C#client之间进行非常简单的TCP/IP通信

Java服务器:

 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();
    }
}