Я работаю в области связи между двумя программами, одна на C ++, а другая на Java, подключенная через стандартные сокеты. Обе программы работают под UNIX (Ubuntu) на одной машине и регулярно обмениваются информацией в течение определенного периода времени. В какой-то момент выполнения и всегда в одной и той же точке он застревает, так как программа на C ++ отправляет информацию, а программа на Java не получает всю информацию, поэтому они блокируются, так как первый ожидает получить это, а второй не отправляет ничего, потому что не получил информацию в первую очередь.
Странно то, что вы запускаете программу на Java под Windows. Тогда все работает нормально, программа корректно завершается без каких-либо блокировок.
Я думаю, что это проблема с приложением Java, но почему разница между запуском под Ubuntu или Windows? Розетка ведет себя по-другому? Отличается ли какой-либо параметр от JVM в Ubuntu и Windows?
Заранее большое спасибо!
Julen.
EDIT:
Это код на стороне Java, который читает буфер:
if (task.equals("receiving")){
try {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = socket.getOutputStream();
// receive messages
char[] length = new char[5];
while (!socket.isClosed()&&(!socket.isInputShutdown())){
in.read(length,0,5);
// this way of reading the length implies that only one command
// at a time can be received and interpreted, so far the iCS does not
// concatenate more commands in one transmission
int commandLength = length[4];
System.err.println("Speed Advice --> command received with length "+ commandLength);
char[] command = new char[commandLength - 1];
in.read(command,0,commandLength - 1);
/*if (cow){
System.err.println("Speed Advice --> Last byte received for X-pos is "+(int)command[commandLength-1]);
}*/
readCommand(command);
}
System.err.println("Speed Advice --> Socket was externally closed.");
in.close();
closeConnection();
}catch (Exception e) {
e.printStackTrace();
}
}
И эта C ++ отправляет информацию:
void
Socket::
send( std::vector<unsigned char> b)
throw( SocketException )
{
if( socket_ < 0 ) return;
size_t numbytes = b.size();
unsigned char *const buf = new unsigned char[numbytes];
for(size_t i = 0; i < numbytes; ++i)
{
buf[i] = b[i];
}
if (verbose_)
{
cerr << "Send " << numbytes << " bytes via tcpip::Socket: [";
for(size_t i = 0; i < numbytes; ++i)
{
buf[i] = b[i];
cerr << " " << (int)b[i] << " ";
}
cerr << "]" << endl;
}
unsigned char const *buf_ptr = buf;
while( numbytes > 0 )
{
#ifdef WIN32
int n = ::send( socket_, (const char*)buf_ptr, static_cast<int>(numbytes), 0 );
#else
int n = ::send( socket_, buf_ptr, numbytes, 0 );
#endif
if( n<0 )
{
// BailOnSocketError definitely throws an exception so clear up heap
delete[] buf;
BailOnSocketError( "send failed" );
}
numbytes -= n;
buf_ptr += n;
}
delete[] buf;
}