2013-06-15 1 views
3

Я пытаюсь отправить данные с моего телефона Android на домашний сервер с помощью сокетов. Мой сервер запускает Linux, поэтому я использовал Perl для кодирования сценария для моего сервера. Соединение работает нормально, и я могу отправить данные моему клиенту, работающему по телефону.соединение между сервером, выполняющим perl skript и android

Проблема в том, что когда я посылаю что-то (первая попытка была простой строкой) на сервер, я ничего не получаю на стороне серверов. Все работает нормально, если я использую telnet для отправки строки на сервер.

Я сижу здесь в течение некоторого времени, и я посмотрел, был ли похожий вопрос на мой вопрос и не нашел ни одного из них, о котором проблема обсуждалась для Android на Perl-скрипте. Вот мой код для Android приложения:

try { 
    Socket socket = new Socket("192.168.178.22", 22222); 
    Statusinformation("connection with server succeed"); 
    BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    Statusinformation(input.readLine()); 

    OutputStream outstream =socket.getOutputStream(); 
    PrintWriter out = new PrintWriter(outstream); 
    out.println("This is a test message from client on phone!\n"); 
    socket.close(); 

    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    Statusinformation("connection unsucsessfull"); 
    e.printStackTrace(); 
    } 

на моем телефоне я получаю это, если я выполнить приведенный выше код:

соединение с сервером успеха! enter image description here

и на стороне сервера, я использую этот код, чтобы получить строку из сокета клиентов:

use IO::Socket; 

my $server = IO::Socket::INET -> new(
    Proto  => 'tcp', 
    LocalPort => 22222, 
    Listen => SOMAXCONN, 
); 

print "Server started..\n"; 

while (1) { 
    next unless my $conect = $server -> accept(); 
    my $childconection = fork; 
    if ($childconection == 0) { 
    handle_connection($conect); 
    } 
} 

sub handle_connection 
{ 
    my $sock = shift; 
    my $client_message=""; 
    my $client_addr = $sock -> peerhost; 

    print "connection: $client_addr connected\n"; 
    print $sock "hi $client_addr, you are connected!\n"; 

    while (1) { 
    open (Tempfile, '>>tempfile.txt'); 

    while ($client_message = <$sock>) { 
     print Tempfile $client_message; 
     print $client_message; 
    } 

    close (Tempfile); 
    } 
    close($sock); 
    exit(0); 
} 
+0

Как создать сокет на стороне сервера? Можете ли вы показать нам соответствующий код? Кроме того, я думаю, что 'While' должен быть строчным. – amon

+0

ok Я обновил почти весь код для сервера. а в верхнем регистре, потому что я ввел образец вручную (sry). если есть такая другая ошибка, то просто игнорируйте ее, если она не является логической. – cyberboy

+2

Ну, это работает для меня: скрипт Perl получает и распечатывает запросы. Тем не менее, дочерние процессы переходят в бесконечный цикл, когда сокет не имеет дополнительных данных. Каково ваше обоснование цикла while (1) в ребенке? – amon

ответ

0

нормально сейчас я немного стыдно. Я решил проблему, добавив: out.flush(); метод flush() гарантирует, что все ожидающие данные отправляются на цель и завершают цель.