2014-01-23 3 views
0

Я занимаюсь простой Java-программой, где я демонстрирую простое взаимодействие с клиентским сервером. Передача первой части сообщения с сервера. Затем программа просто продолжает работать и не выполняется? Нужно ли создавать новый сокет для каждого отдельного трафика?Программирование на клиент/сервер

Серверный код

server = new ServerSocket(4587); 
System.out.print("Starting the Server on port " + server.getLocalPort() + "\n"); 
System.out.println("Waiting for client..."); 

Socket client = server.accept(); 
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 
BufferedReader br1 = new BufferedReader(new InputStreamReader(client.getInputStream())); 
br.write("Hello, you are connected to Server. What is your name?"); 
br.write("\n"); 
br.flush(); 



while((s=br1.readLine())!=null) 
    { 

    } 
    br.write("Thank you "); 
    br.newLine(); 
    br.flush(); 
    } 

Клиентский код

String stdin; 
System.out.println("Attempting to connect to " + hostname + ":" + port); 
client = new Socket("localhost", 4587); 
System.out.println("Connection Established"); 

BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream())); 
while ((stdin = br.readLine()) != null) { 
    System.out.println(stdin); 
} 

BufferedWriter br1 = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 
br1.write("Mike"); 
br1.write("\n"); 
br1.flush(); 

while ((stdin = br.readLine()) != null) { 
    System.out.println(stdin); 
} 

Сервер Выход

Starting the Server on port4587 
Waiting for client.... 

Client Выход

Attempting to connect to :123 
Connection Established 
Hello you are connected to Server, What is ur name 

Если это может помочь. После этого оба цикла

+0

Почему вниз голосования? Он показал усилие. – bblincoe

+0

Ну, ИМХО, проблема сообщается смутно, и нет четкой ссылки на код. –

ответ

0

Ваш сервер сначала создаст соединение с клиентом с помощью метода accept. Если вы хотите иметь несколько клиентов, вам нужно будет изменить свой код, чтобы принять это.

На стороне клиента вы используете \n, чтобы очертить конец сообщения. Это будет работать нормально. Каждый раз, когда вы отправляете новое сообщение, используйте \n, чтобы указать конец сообщения.

На стороне сервера вы должны продолжить чтение с ввода-вывода, пока не увидите \n. В этот момент вы получили все сообщение. Обработайте его, а затем снова начните слушать.

Edit:

Поскольку вы ждете от имени клиента, вы можете просто сделать следующее на сервере:

BufferedWriter bout = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 
BufferedReader bin = new BufferedReader(new InputStreamWriter(client.getInputStream())); 
// Wait for incoming name from client. 
String name = bin.readline(); 
System.out.println(name); 
// Send a reply. 
bout.write("Thank you\n"); 
bout.flush(); 

Аналогично, на стороне клиента (при условии, bin и bout определены так же, как указано выше):

// Send name to server. 
bout.write("Name\n"); 
bout.flush(); 
// Get a response from the server and print to console. 
String response = bin.readline(); 
System.out.println(response); 
+0

как я должен использовать цикл while при чтении с клиента – Koneri

+0

Это было бы приемлемо - это действительно зависит от того, чего вы пытаетесь достичь. Внутри цикла 'while' вы можете читать каждое сообщение и обрабатывать его. После вашего завершения вы вернетесь к следующей строке.Вы можете подумать о том, чтобы слушать навсегда (в цикле 'while (true)') в отдельном потоке, чтобы сервер мог делать другие вещи, кроме прослушивания все время. – bblincoe

+0

Я редактировал код сервера. Не могли бы вы взглянуть на него? – Koneri

0

Это потому, что BufferedReader имеет def ault buffer = 8K, когда в процессе чтения и этот процесс является блочным вводом-выводом, поэтому он будет висеть в этой точке. Вы должны прочитать полное сообщение от клиента по серверу.

0

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

Для выхода из цикла вам нужно послать сигнал EOF или конец сигнала потока (в соответствии с Документами: http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#readLine%28%29)

+0

Он отправляет '\ n', что является его индикатором для EOF. – bblincoe

Смежные вопросы