使用java中的套接字创建简单的客户端/代理/服务器程序

时间:2015-02-13 20:36:12

标签: java sockets proxy client server

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

}

有人知道我做错了吗?

1 个答案:

答案 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);
}

......没有任何循环。