Каков наилучший способ отправки потока данных через сокет?

#c# #sockets

Вопрос:

я создал программу, в которой есть некоторые данные, которые я хочу отправлять несколько раз в секунду через сокет. Приведенный ниже код (на стороне клиента) работает нормально и вызывается 60 раз в секунду, но я подумал, что, возможно, закрывать сокет каждый раз, когда я хочу отправить некоторые данные, не лучший вариант или он неэффективен. Проблема в том, что пока я не закрою сокет, серверная часть не считывает данные в сокете.

На стороне клиента в C # (функция Update вызывается несколько раз в секунду):

 void Update()
{


    soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);


    string server = "127.0.0.1";
    IPAddress ipAdd = IPAddress.Parse(server);
    
    IPEndPoint remoteEP = new IPEndPoint(ipAdd, 3456);

    soc.Connect(remoteEP);

    byte[] msg = System.Text.Encoding.ASCII.GetBytes("velocidad(k/h): "   telemetria.vehicle.data.Get(Channel.Vehicle, VehicleData.Speed)*3.6f/1000.0f);

    soc.Send(msg);

    soc.Close();
}
 

Серверная часть в Java

 public static void main(String[] args) throws IOException{
    ServerSocket ss = new ServerSocket(3456);
    while(true) {
        Socket s = ss.accept();
        InputStreamReader in = new InputStreamReader(s.getInputStream());
        BufferedReader bf = new BufferedReader(in);
        String str = bf.readLine();
        System.out.println(str);
    }
}
 

Комментарии:

1. Вы используете readLine() на стороне Java, но не отправляете строки на стороне C #. Пожалуйста, прочитайте документацию readline о том, что представляет собой строку .

2. Лучший способ — просто отправить его. Когда пользователь откроет программу, создайте сокет и подключитесь к серверу. Затем, когда есть данные для отправки, вы просто отправляете их. Когда пользователь закрывает программу, вы закрываете сокет. И да, причина, по которой вы считаете, что вам нужно закрыть, вероятно, заключается в том, что вы пытаетесь прочитать строку.