使用 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();
}
}
有人知道我做错了什么吗?
看看你的代理。首先sock
Socket代表与客户端的连接,然后sck
Socket代表与服务器的连接。但是,当您创建 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);
...没有任何循环。
我正在完成一项任务,我必须制作 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();
}
}
有人知道我做错了什么吗?
看看你的代理。首先sock
Socket代表与客户端的连接,然后sck
Socket代表与服务器的连接。但是,当您创建 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);
...没有任何循环。