Я работаю над назначением, где мне нужно сделать 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();
}
}
Кто-нибудь знает, что я делать не так?
Ваша петля ошибочна. Он не действует как петля. Вам просто нужно прочитать из сокета в цикле. Вы не должны выйти из цикла, пока не увидите нулевую строку из потока. Какую ошибку вы получаете? –
попробуйте вызвать 'ps.flush();' after 'ps.println()' в 'Proxy.run()' – AGV
Вы делаете все неправильно. Ваш прокси-сервер является однопоточным; он использует Readers и Writers, где он должен использовать потоки; он копирует ровно одну строку от клиента к серверу и ничего в обратном направлении. – EJP