2015-02-13 2 views
0

Я работаю над назначением, где мне нужно сделать 3 программы, клиент, прокси и сервер. Клиент должен отправлять сообщения на сервер, отправляя их в прокси-сервер, который отправляет их на сервер, и наоборот. Сервер ожидает прокси-сервера для подключения к нему, и прокси ожидает, что клиент подключится к нему, а затем клиент отправит сообщение прокси-серверу, который отправляется на сервер. Когда я их компилирую, хотя прокси-сервер получает сообщение в порядке, служба получает сообщение об ошибке.Создание простых клиентских/прокси-серверных программ с использованием сокетов в java

Exception in thread "main" java.net.SocketException: Connection reset 
at java.net.SocketInputStream.read(SocketInputStream.java:196) 
at java.net.SocketInputStream.read(SocketInputStream.java:122) 
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283) 
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325) 
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177) 
at java.io.InputStreamReader.read(InputStreamReader.java:184) 
at java.io.BufferedReader.fill(BufferedReader.java:154) 
at java.io.BufferedReader.readLine(BufferedReader.java:317) 
at java.io.BufferedReader.readLine(BufferedReader.java:382) 
at Server.run(Server.java:18) 
at Server.main(Server.java:8) 

Вот код клиента

import java.net.*; 
import java.io.*; 


public class Client { 

public static void main(String[] args) throws Exception{ 
    Client serv = new Client(); 
    serv.run(); 
    } 

    public void run() throws Exception{ 
    Socket sock = new Socket("localhost", 7777); 
    PrintStream ps = new PrintStream(sock.getOutputStream()); 
    ps.println("Hello Server"); 
    sock.close(); 
    } 

} 

Вот прокси,

import java.net.*; 
import java.io.*; 

public class Proxy { 

public static void main (String[] args) throws Exception{ 
    Proxy serv = new Proxy(); 
    serv.run(); 
} 

    public void run() throws Exception{ 
    ServerSocket ss = new ServerSocket(7777); 
    Socket sock = ss.accept(); 

    InputStreamReader ir = new InputStreamReader(sock.getInputStream()); 
    BufferedReader br = new BufferedReader(ir); 

    String message = ""; 
    message = br.readLine(); 
    System.out.println(message); 

    Socket sck = new Socket("localhost", 8888); 
    PrintStream ps = new PrintStream(sock.getOutputStream()); 

    boolean waiting = true; 
    while(waiting){ 
     if(message != null){ 
     ps.println("Hey Server, Client says: " + message); 
     waiting = false; 
     } 
    } 
    sock.close(); 
    } 

} 

и здесь является сервер

import java.net.*; 
import java.io.*; 

public class Server { 

    public static void main (String[] args) throws Exception{ 
    Server serv = new Server(); 
    serv.run(); 
    } 

    public void run() throws Exception{ 
    ServerSocket ss = new ServerSocket(8888); 
    Socket sock = ss.accept(); 

    InputStreamReader ir = new InputStreamReader(sock.getInputStream()); 
    BufferedReader br = new BufferedReader(ir); 

    System.out.println(br.readLine()); 
    sock.close(); 
    ss.close(); 
    } 

} 

Кто-нибудь знает, что я делать не так?

+0

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

+0

попробуйте вызвать 'ps.flush();' after 'ps.println()' в 'Proxy.run()' – AGV

+0

Вы делаете все неправильно. Ваш прокси-сервер является однопоточным; он использует Readers и Writers, где он должен использовать потоки; он копирует ровно одну строку от клиента к серверу и ничего в обратном направлении. – EJP

ответ

0

Посмотрите на свой прокси. Сначала sock Socket представляет соединение с клиентом, а затем sck Сокет представляет соединение с сервером. Однако при создании PrintStream ps для подключения к серверу вы используете sock.getOutputStream, а не sck.getOutputStream. Вы говорите ему, чтобы отправить информацию обратно клиенту, который не имеет открытого BufferedReader для интерпретации или открытого Socket в этой точке. Попытка написать закрытое соединение приводит к исключению сброса соединения.

Во-вторых (хотя это не вызывает ошибки), ваш прокси-сервер в то время, когда цикл все вставлен. Если вы проверите его, он, очевидно, будет проходить через минимум, потому что для ожидания по умолчанию используется значение true. Затем вы проверяете, есть ли message != null. В этом случае message никогда не будет пустым, потому что клиент настроен всегда на отправку одного и того же сообщения и только одно сообщение. Самое главное, однако, если по какой-либо причине messageбыл null, в этом цикле ничего нет, чтобы изменить это - он не пытается прочитать следующее значение от br или что-то еще, поэтому вы просто застряли в бесконечном в то время как цикл.

Я считаю, что вы искали было это:

String message; 
while((message = br.readLine()) != null){ 
    ps.println("Hey server, Client says: " + message); 
} 

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

ps.println("Hey server, Client says: " + message); 

... без каких-либо циклов.

+0

Это исправлено, спасибо, я избавился от цикла while и исправил носок до sck, и сервер получил сообщение, спасибо! – frostwatch

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