SCTP:java.net.ConnectException:连接被拒绝

时间:2016-02-22 11:22:10

标签: java networking sctp

我试图实现SCTP连接,从服务器端一切正常,但是当我运行客户端程序时,我收到以下错误:

java.net.ConnectException: Connection refused
    at sun.nio.ch.SctpNet.connect0(Native Method)
    at sun.nio.ch.SctpNet.connect(SctpNet.java:73)
    at sun.nio.ch.SctpChannelImpl.connect(SctpChannelImpl.java:372)
    at sun.nio.ch.SctpChannelImpl.connect(SctpChannelImpl.java:438)
    at com.sun.nio.sctp.SctpChannel.open(SctpChannel.java:221)
    at com.eska.sctp.client.SCTPClient.<init>(SCTPClient.java:20)
    at com.eska.sctp.client.SCTPClient.main(SCTPClient.java:62)

服务器代码:

import java.io.IOException;
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.util.Iterator;

import com.sun.nio.sctp.AbstractNotificationHandler;
import com.sun.nio.sctp.AssociationChangeNotification;
import com.sun.nio.sctp.AssociationChangeNotification.AssocChangeEvent;
import com.sun.nio.sctp.HandlerResult;
import com.sun.nio.sctp.MessageInfo;
import com.sun.nio.sctp.SctpChannel;
import com.sun.nio.sctp.SctpServerChannel;
import com.sun.nio.sctp.ShutdownNotification;

public class SCTPServer {
    private final static int SERVER_PORT = 1111;
    private final static int BUFFER_SIZE = 1024;

    private SctpServerChannel ssc;

    public SCTPServer(int port) throws IOException {
        this.ssc = SctpServerChannel.open();
        // m.alkhader
        // this.ssc.bind(new InetSocketAddress(port));
        this.ssc.bind(new InetSocketAddress("127.0.0.1", port));

        System.out.println("SCTP server started.");
        System.out.println("Local addresses :");
        Iterator iterator = this.ssc.getAllLocalAddresses().iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

    public void launch() throws IOException {
        ByteBuffer buf = ByteBuffer.allocate(BUFFER_SIZE);
        CharBuffer cbuf = CharBuffer.allocate(BUFFER_SIZE);

        Charset charset = Charset.forName("ISO-8859-1");
        CharsetDecoder decoder = charset.newDecoder();

        while (true) {
            System.out.println("Waiting for client connection...");

            SctpChannel sc = this.ssc.accept();

            System.out.println("Client connected");
            System.out.println("Remote adresses :");
            Iterator iterator = sc.getRemoteAddresses().iterator();
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
            }

            AssociationHandler assocHandler = new AssociationHandler();
            MessageInfo messageInfo = null;

            do {
                buf.clear();
                cbuf.clear();

                messageInfo = sc.receive(buf, null, assocHandler);
                buf.flip();

                messageInfo.unordered(true);
                if (messageInfo != null && buf.limit() > 0) {
                    decoder.decode(buf, cbuf, true);
                    cbuf.flip();

                    System.out.print("Stream(" + messageInfo.streamNumber()
                            + "):");
                    System.out.println(cbuf);
                }

            } while (messageInfo != null && buf.limit() > 0);
            System.out.println("Connection closed by peer.");
        }
    }

    public static void main(String[] args) {
        try {
            SCTPServer server = new SCTPServer(SERVER_PORT);
            server.launch();
        } catch (IOException e) {
            System.out.println("Error : " + e.getMessage());
        }
    }

    static class AssociationHandler extends AbstractNotificationHandler {

        public HandlerResult handleNotification(
                AssociationChangeNotification not, PrintStream stream) {
            if (not.event().equals(AssocChangeEvent.COMM_UP)) {
                int outbound = not.association().maxOutboundStreams();
                int inbound = not.association().maxInboundStreams();
                stream.printf("New association setup with %d outbound streams"
                        + ", and %d inbound streams.\n", outbound, inbound);
            }
            return HandlerResult.CONTINUE;
        }

        public HandlerResult handleNotification(ShutdownNotification not,
                PrintStream stream) {
            stream.printf("The association has been shutdown.\n");
            return HandlerResult.RETURN;
        }
    }
 }

客户代码:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.util.Scanner;

import com.sun.nio.sctp.MessageInfo;
import com.sun.nio.sctp.SctpChannel;

public class SCTPClient {
    private SctpChannel sc;
    private final static int SERVER_PORT = 1111;
    private final static int BUFFER_SIZE = 1024;

    public SCTPClient(String addr, int port) throws IOException {
        this.sc = SctpChannel.open(new InetSocketAddress(addr, port), 0, 0);
    }

    public void start() throws IOException {
        MessageInfo messageInfo = MessageInfo.createOutgoing(null, 0);
        Charset charset = Charset.forName("ISO-8859-1");
        CharsetEncoder encoder = charset.newEncoder();

        ByteBuffer buf = ByteBuffer.allocate(BUFFER_SIZE);
        CharBuffer cbuf = CharBuffer.allocate(BUFFER_SIZE);

        Scanner scan = new Scanner(System.in);

        int i = 0;
        int max = this.sc.association().maxInboundStreams();

        // messageInfo.unordered(true);

        while (scan.hasNext()) {
            buf.clear();
            cbuf.clear();

            cbuf.put(scan.nextLine());
            cbuf.flip();

            encoder.encode(cbuf, buf, true);
            buf.flip();

            messageInfo.streamNumber(i % max);
            this.sc.send(buf, messageInfo);

            i++;
        }
    }

    public void stop() throws IOException {
        this.sc.close();
    }

    public static void main(String[] args) {
        try {
            System.out.println("Client");
            SCTPClient client = new SCTPClient("127.0.0.1", SERVER_PORT);
            // SCTPClient client = new SCTPClient("192.168.0.1", SERVER_PORT);

            System.out.println("Hello Client");
            client.start();
            client.stop();
        } catch (IOException e) {
            System.out.println("Error   : " + e.getMessage());
            e.printStackTrace();
        }

    }
}

从服务器方面一切正常

0 个答案:

没有答案