使用 java 中的套接字制作简单的 client/proxy/server 程序

Making simple client/proxy/server programs using sockets in java

我正在完成一项任务,我必须制作 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();
    }

}

有人知道我做错了什么吗?

看看你的代理。首先sockSocket代表与客户端的连接,然后sckSocket代表与服务器的连接。但是,当您创建 PrintStream ps 以连接服务器时,您使用的是 sock.getOutputStream 而不是 sck.getOutputStream。您告诉它向客户端发送信息 back,客户端此时没有打开的 BufferedReader 可以解释,也没有打开的 Socket。尝试写入已关闭的连接会导致连接重置异常。

其次(尽管这不是导致错误的原因),您的代理 while 循环全部被顶起。如果你检查它,它显然会在 least 处循环一次,因为等待默认为 true。然后,您正在检查是否 message != null。在这种情况下,message 永远不会为空,因为客户端设置为始终发送相同的消息,并且只发送一条消息。然而,最重要的是,如果出于某种原因 message null,则 while 循环中没有任何内容可以更改它——它不会尝试从 br 或任何东西,所以你只会陷入无限的 while 循环。

我相信你要找的是这个:

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

但是正如我所说,在这种情况下不需要 while 循环,因为客户端设置为无论如何只发送一条消息,所以您可以简单地这样做:

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

...没有任何循环。