我目前正在java中实现一个多线程代理服务器,它将接受来自客户端的消息并将它们转发到另一个服务器,然后该服务器将确认消息的接收。但是,我很难这样做。有人能指出我做错了什么吗?感谢。
ProxyApp:
public class ProxyApp {
public static ServerSocket server = null;
public static Socket client = null;
public static void main(String[] args)
{
try
{
server = new ServerSocket(6789);
Socket clientsocket = null;
while(true)
{
client = server.accept();
if(client.isConnected())
{
System.out.println("Proxy is currently listening to client on port 6789");
}
Thread t1 = new ProxyHandler(client);
t1.start();
clientsocket = new Socket(InetAddress.getLocalHost(), 6780);
if(clientsocket.isBound())
{
System.out.println("Clientsocket successfully connected on port 6780");
}
ProxyHandler t2 = new ProxyHandler(clientsocket);
t2.start();
}
}
catch(IOException io)
{
System.err.println("IOException: " + io.getMessage());
}
}
}
ProxyHandler :
public class ProxyHandler extends Thread {
private Socket socket;
private String message;
public ProxyHandler(Socket socket)
{
this.socket = socket;
}
@Override
public void run()
{
message = "";
try
{
DataInputStream in = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
while(true)
{
message = in.readUTF();
out.writeUTF(message);
System.out.println(message);
}
}
catch(IOException io)
{
System.err.println("IOException: " + io.getMessage());
System.exit(2);
}
}
}
ClientClass:
public class ClientClass {
public static void main(String[] args)
{
try
{
Socket client = new Socket(InetAddress.getLocalHost(), 6789);
if(client.isBound())
{
System.out.println("Successfully connected on port 6789");
}
Scanner scanner = new Scanner(System.in);
DataInputStream inFromProxy = new DataInputStream(client.getInputStream());
DataOutputStream outToProxy = new DataOutputStream(client.getOutputStream());
while(true)
{
String message;
System.out.print("Enter your message: ");
message = scanner.next();
outToProxy.writeUTF(message);
System.out.println(inFromProxy.readUTF());
}
}
catch(IOException io)
{
System.err.println("IOException: " + io.getMessage());
System.exit(2);
}
}
}
ServerClass:
public class ServerClass {
public static void main(String[] args)
{
try
{
ServerSocket server = new ServerSocket(6780);
if(server.isBound())
{
System.out.println("Server successfully connected on port 6780");
}
Socket client = null;
while(true)
{
client = server.accept();
if(client.isConnected())
{
System.out.println("Proxy is connected");
}
DataInputStream inFromProxy = new DataInputStream(client.getInputStream());
DataOutputStream outToProxy = new DataOutputStream(client.getOutputStream());
System.out.println(inFromProxy.readUTF());
outToProxy.writeUTF("Message has been acknowledged!");
}
}
catch(IOException io)
{
System.err.println("IOException: " + io.getMessage());
System.exit(2);
}
}
}
答案 0 :(得分:3)
以下代码中的in和out表示来自同一台机器的消息:
DataInputStream in = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
因此,当您从中读取并写出时,您所做的只是创建一个回显服务。
message = in.readUTF();
out.writeUTF(message);
对于代理,您希望从客户端读取并写入服务器,反之亦然。
您似乎想要更接近这一点:
client = server.accept();
clientsocket = new Socket(InetAddress.getLocalHost(), 6780);
Thread t1 = new ProxyHandler(client, clientsocket );
t1.start();
Thread t2 = new ProxyHandler(clientsocket, client);
t2.start();
第一个线程的作业是将数据从客户端发送到服务器,第二个作业是从服务器发送到客户端。