-2

私は現在、クライアントからのメッセージを受け入れ、メッセージの受信を確認する別のサーバーに転送するマルチスレッド プロキシ サーバーを Java で実装しています。しかし、私はそうするのに苦労しています。誰かが私が間違っていることを指摘できますか? ありがとう。

import java.io.*;
import java.net.*;
import java.util.Scanner;

public class Client{

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

サーバー コード Server.java:

import java.io.*;
import java.net.*;

/** 
 *  the client send a String to the server the server returns it in UPPERCASE thats all
 */

public class Server {

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




import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.*;

public class Proxy{

    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");
        }
        clientsocket = new Socket(InetAddress.getLocalHost(), 6780);
        Thread t1 = new ProxyHandler(client, clientsocket);
        t1.start();


        if(clientsocket.isBound())
        {
            System.out.println("Clientsocket successfully connected on port 6780");
        }

        Thread t2 = new ProxyHandler(clientsocket, client);
        t2.start();                                                               

    }
}
catch(IOException io)
{
    System.err.println("IOException: " + io.getMessage());
}
}
}

プロキシ コードは次のとおりです。

import java.io.*;
import java.net.*;

public class ProxyHandler extends Thread {
private Socket socket;
private String message;
public ProxyHandler(Socket socket, Socket clientsocket)
{
    this.socket = socket;        
}

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);
    }
}
}
4

1 に答える 1

1
  • ここにはマルチスレッドはありません。あるはずです。受け入れられた各ソケットは、サーバーとプロキシの両方で、独自のスレッドで完全に処理される必要があります。
  • ソケットを作成して接続した直後に isBound() をテストしても意味がありません。決して嘘ではありません。
  • accept() の直後に isConnected() をテストしても意味がありません。決して嘘ではありません。
  • サーバーは、受け付けた各ソケットの処理が終了したら、つまり、そこから EOS を取得したら (read() が -1 を返す)、そのソケットを閉じる必要があります。
  • プロキシは、承認された各ソケットも、処理が終了したら閉じる必要があります。
  • あらゆる種類のプロキシは、バイトをコピーするだけです。データの形式について仮定するべきではありません。readUTF() を使用しないでください。count = read(byte[]) および write(buffer, 0, count) を使用してください。これは、プロキシに DataInput/OutputStreams が必要ないことも意味します。
于 2013-02-03T07:36:40.417 に答える