Простая клиент-серверная программа не работает

Программа сервера:

import java.io.*;
import java.net.*;
public class server
{
        public static void main(String args[])
        {
                try
                {
                ServerSocket ss=new ServerSocket(2000);
                Socket s=ss.accept();
                BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
                String str;
                while((str=br.readLine())!=null)
                {
                        System.out.println(str);
                }
                }
                catch(Exception e)
                {
                        System.out.println(e);
                }
        }
}

Клиентская программа:

import java.net.*;
import java.io.*;
public class client
{
        public static void main(String args[])
        {
                try
                {
                Socket s=new Socket("127.0.0.1",2000);
                String str;
                BufferedWriter br=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
                br.write("\nHello World\n");
                }
                catch(Exception e)
                {
                        System.out.println(e);
                }
        }
}

Проблемы, с которыми я сталкиваюсь:

  1. Нет выхода.
  2. Никаких исключений/ошибок не указано.

Пожалуйста, объясните мне, если я делаю что-то не так. Проблема может заключаться в том, что клиент ничего не записал, пока сервер читает.


person Usual Suspect    schedule 06.11.2013    source источник
comment
Попробуйте flush() BufferedWriter.   -  person Matthias    schedule 06.11.2013
comment
если ваша проблема решена моим ответом, вы можете выбрать мой ответ   -  person Ashish    schedule 20.12.2013


Ответы (2)


Закройте поток после записи в поток в клиентской программе br.close();

После записи в поток обязательно закрыть поток или очистить поток (br.flush()), потому что, когда поток закрыт, только этот поток может быть прочитан. Операции ввода-вывода не могут выполняться в одном и том же потоке одновременно.

Два сокета связаны одним и тем же потоком, поэтому операции ввода-вывода не могут выполняться одновременно в этом потоке.

person Ashish    schedule 06.11.2013

Пожалуйста, добавьте оператор отладки, чтобы проверить

(1) может ли клиент установить соединение с работающим сервером или нет. так в серверной части добавить

Socket s=ss.accept();
System.out.println("one new connection");

(2) также в клиентской программе добавьте flush() после строки br.write

 br.write("\nHello World\n");
 br.flush()

 // use the below statement as well at last (if you no longer want to use the output stream)
 br.close();

Обратите внимание, что вы просто пишете здесь один раз.... для непрерывного чтения и записи вам придется запускать это в цикле.... ИЛИ для одновременного запуска нескольких клиентов... вам нужно будет выполнить каждое соединение сокета (после принятия это) в другой поток на стороне сервера

person Rakesh Soni    schedule 06.11.2013
comment
Большой палец вверх, Сони!! Но почему? Не могли бы вы объяснить? - person Usual Suspect; 06.11.2013
comment
Из-за цели оптимизации памяти JAVA не будет писать после каждого оператора write(). он просто сохраняет записанные данные в буфер (блок памяти)... и когда этот буфер заполнится... java запишет его в сокет.... сбрасывая, вы записываете его немедленно, не дожидаясь заполнения буфера. обычно размер буфера кратен 1024 байтам. - person Rakesh Soni; 06.11.2013