#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. Лучший способ — просто отправить его. Когда пользователь откроет программу, создайте сокет и подключитесь к серверу. Затем, когда есть данные для отправки, вы просто отправляете их. Когда пользователь закрывает программу, вы закрываете сокет. И да, причина, по которой вы считаете, что вам нужно закрыть, вероятно, заключается в том, что вы пытаетесь прочитать строку.