-1

Java でネットワーク ストリームの配列を作成する方法はありますか。C# は、ネットワーク ストリームの配列の作成をサポートしています。

私の知る限り、Java でデータを送受信するには、個別の InputStreams と OutputStreams を作成する必要があります。

私がやりたいことは、データを送受信するために多数の TCP 接続を確立することです。

これに対するJavaでの回避策はありますか?

4

1 に答える 1

0

次のように Socket の複数のインスタンスを作成することで、これを実現できます。

サーバー.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server
{
    private static int CLIENT_COUNT = 0;

    public static void main(String[] args) throws IOException
    {
        ServerSocket ss = new ServerSocket(2000);
        while(true)
        {
            Socket s = ss.accept();
            new SocketHandler("Handler#" + ++CLIENT_COUNT, s).start();
        }
    }
}

class SocketHandler extends Thread
{
    private PrintWriter pw;
    private BufferedReader br;

    public SocketHandler(String name, Socket socket) throws IOException
    {
        super(name);
        this.pw = new PrintWriter(socket.getOutputStream(), true);
        this.br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }

    @Override
    public void run()
    {
        String message;
        try
        {
            while((message = br.readLine()) != null)
            {
                System.out.println("Server#" + getName() + " - Client sent: " + message);
                sendMessage("Server#" + getName() + ": echo " + message);
            }
        }
        catch(IOException e)
        {
            e.printStackTrace();
            System.out.println("Server#" + getName() + " -> IOException");
        }
    }

    public void sendMessage(String message)
    {
        pw.println(message);
        System.out.println("Server#" + getName() + " is sending ~ " + message);
    }
}

クライアント.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client
{
    private static int SOCKET_COUNT = 0;

    public static void main(String[] args) throws UnknownHostException, IOException
    {
        Socket s1 = new Socket(InetAddress.getLocalHost(), 2000);
        Socket s2 = new Socket(InetAddress.getLocalHost(), 2000);
        Socket s3 = new Socket(InetAddress.getLocalHost(), 2000);
        Socket s4 = new Socket(InetAddress.getLocalHost(), 2000);

        LocalSocketHandler h1 = new LocalSocketHandler("LocalHandler#" + ++SOCKET_COUNT, s1);
        LocalSocketHandler h2 = new LocalSocketHandler("LocalHandler#" + ++SOCKET_COUNT, s2);
        LocalSocketHandler h3 = new LocalSocketHandler("LocalHandler#" + ++SOCKET_COUNT, s3);
        LocalSocketHandler h4 = new LocalSocketHandler("LocalHandler#" + ++SOCKET_COUNT, s4);

        h1.start();
        h2.start();
        h3.start();
        h4.start();

        h1.sendMessage("I am socket #1!");
        h2.sendMessage("I am socket #2!");
        h3.sendMessage("I am socket #3!");
        h4.sendMessage("I am socket #4!");
    }
}

class LocalSocketHandler extends Thread
{
    private PrintWriter pw;
    private BufferedReader br;

    public LocalSocketHandler(String name, Socket socket) throws IOException
    {
        super(name);
        this.pw = new PrintWriter(socket.getOutputStream(), true);
        this.br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }

    @Override
    public void run()
    {
        String message;
        try
        {
            while((message = br.readLine()) != null)
            {
                System.out.println("Client#" + getName() + " - Server sent: " + message);
            }
        }
        catch(IOException e)
        {
            e.printStackTrace();
            System.out.println("Client#" + getName() + " -> IOException");
        }
    }

    public void sendMessage(String message)
    {
        pw.println(message);
        System.out.println("Client#" + getName() + " is sending ~ " + message);
    }
}

クライアントのコンソール:

Client#LocalHandler#1 is sending ~ I am socket #1!
Client#LocalHandler#2 is sending ~ I am socket #2!
Client#LocalHandler#3 is sending ~ I am socket #3!
Client#LocalHandler#4 is sending ~ I am socket #4!
Client#LocalHandler#1 - Server sent: Server#Handler#1: echo I am socket #1!
Client#LocalHandler#3 - Server sent: Server#Handler#3: echo I am socket #3!
Client#LocalHandler#2 - Server sent: Server#Handler#2: echo I am socket #2!
Client#LocalHandler#4 - Server sent: Server#Handler#4: echo I am socket #4!

サーバーのコンソール:

Server#Handler#1 - Client sent: I am socket #1!
Server#Handler#1 is sending ~ Server#Handler#1: echo I am socket #1!
Server#Handler#3 - Client sent: I am socket #3!
Server#Handler#3 is sending ~ Server#Handler#3: echo I am socket #3!
Server#Handler#2 - Client sent: I am socket #2!
Server#Handler#2 is sending ~ Server#Handler#2: echo I am socket #2!
Server#Handler#4 - Client sent: I am socket #4!
Server#Handler#4 is sending ~ Server#Handler#4: echo I am socket #4!
于 2012-10-12T15:41:25.670 に答える