首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Codenameone关闭插座

Codenameone关闭插座
EN

Stack Overflow用户
提问于 2016-10-05 22:10:43
回答 1查看 102关注 0票数 2

似乎无法在不导致服务器端连接重置错误的情况下断开套接字。

我在一个测试器应用程序中使用com.codename1.io.Socketcom.codename1.io.SocketConnection实现。我的代码如下:

代码语言:javascript
复制
private SpanLabel lblStatus;
private SpanLabel lblIncoming;
private CustomSocketConnection con;
private Thread tIncoming;

public ConnectForm() {
    con = getSocketConnection();
    Button btnConnect = getConnectButton();
    Button btnDisconnect = getDisconnectButton();
    Button btnSendMessage = getSendMessageButton();
    lblStatus = getInfoLabel();
    lblIncoming = getIncomingLabel();

    setLayout(new BoxLayout(BoxLayout.Y_AXIS));
    addComponent(btnConnect);
    addComponent(btnDisconnect);
    addComponent(btnSendMessage);
    addComponent(lblStatus);
    addComponent(lblIncoming);
}

private Button getConnectButton() {
    Button btn = new Button("Connect (localhost)");
    btn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            Socket.connect("localhost", 8687, con);
        }
    });
    return btn;
}

private Button getDisconnectButton() {
    Button btn = new Button("Disconnect");
    btn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            //??? I don't know how to do this
            try {
                tIncoming.join();
            } catch (Exception e) {
                e.printStackTrace();
                tIncoming.interrupt();
            }
        }
    });
    return btn;
}

private Button getSendMessageButton() {
    Button btn = new Button("Send Message");
    btn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            try {
                con.os.write("Hello".getBytes());
                con.os.write(Integer.parseInt("04", 16)); //end of transmit
                con.os.flush();
                lblStatus.setText("Message Sent");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
    return btn;
}

private SpanLabel getInfoLabel() {
    return new SpanLabel("Disconnected");
}

private SpanLabel getIncomingLabel() {
    return new SpanLabel("...");
}

private CustomSocketConnection getSocketConnection() {
    return new CustomSocketConnection();
}

class CustomSocketConnection extends SocketConnection {

    public OutputStream os;
    public InputStream is;

    @Override
    public void connectionError(int errorCode, String message) {
        lblStatus.setText("Error Connecting. ErrorCode: " + errorCode + " Message: " + message);
    }

    @Override
    public void connectionEstablished(InputStream is, OutputStream os) {
        lblStatus.setText("Connected :)");
        this.is = is;
        this.os = os;
        spawnIncomingMessageWatcher();
    }
}

private void spawnIncomingMessageWatcher() {
    tIncoming = new Thread(new Runnable() {
        public void run() {
            String s = "";
            int eot = Integer.parseInt("04", 16);
            while (con.isConnected()) {
                try {
                    int temp;
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    while (((temp = con.is.read()) != -1) && (temp != eot)) {
                        baos.write(temp);
                    }
                    lblIncoming.setText(new String(baos.toByteArray()));
                    Thread.sleep(2000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    });
    tIncoming.start();
}

对于getDisconnectButton()方法,我不知道如何正确地断开与服务器的连接,因为SocketConnection对象似乎没有合适的方法来实现这一点。

EN

回答 1

Stack Overflow用户

发布于 2016-10-05 23:20:11

如果在输入或OutputStream上调用close(),则关闭套接字,代码来自Socket.SocketInputStream类link

代码语言:javascript
复制
    public void close() throws IOException {
        closed = true;
        if(Util.getImplementation().isSocketConnected(impl)) {
            Util.getImplementation().disconnectSocket(impl);
            con.setConnected(false);
        }
    }

因此,首先向Server发送close指令,然后关闭一个流。

希望这能帮上忙

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39876287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档