我正在完成一项任务,我必须制作3个程序,一个客户端,一个代理和一个服务器。客户端应该通过将消息发送到代理来向服务器发送消息,代理将消息发送到服务器,反之亦然。服务器等待代理连接到它,并且代理等待客户端连接到它,然后客户端向代理发送消息并将其发送到服务器。当我编译它们时,虽然代理获得了正确的消息,但是服务器会出错。
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)
看看你的代理人。首先sock
Socket表示与客户端的连接,然后sck
Socket表示与服务器的连接。但是,当您创建PrintStream ps
以与服务器连接时,您使用sock.getOutputStream
而不是sck.getOutputStream
。您告诉它将信息发送回到客户端,该客户端没有要解释的打开的BufferedReader,也没有打开的Socket。尝试写入已关闭的连接会导致连接重置异常。
其次(虽然这不会导致错误),您的代理while循环全部被抢占。如果你检查它,它显然会在至少一次循环,因为等待默认为真。然后,您正在检查是否message != null
。在这种情况下,message
将永远不会为空,因为客户端设置为始终发送相同的消息,并且只发送一条消息。但最重要的是,如果由于某种原因message
为null,则while循环中没有任何内容可以更改它 - 它不会尝试从{{1}读取下一个值或者任何东西,所以你只会被困在无限循环中。
我相信你所寻找的是:
br
但正如我所说,在这种情况下不需要while循环,因为客户端设置为只发送一条消息,所以你可以这样做:
String message;
while((message = br.readLine()) != null){
ps.println("Hey server, Client says: " + message);
}
......没有任何循环。