簡體   English   中英

為什么我無法通過套接字接收數據

[英]Why I can't receive data by a socket

我可以在python中發送數據並在服務器中接收,但是睡眠超過1毫秒后(如果執行了一些For-loops(例如:for range(0,60)中的i:print i),結果是相同的),我使用套接字發送數據,但是在Java服務器中無法接收。

有代碼:客戶端是用python2編寫的:

address = ('127.0.0.1', 9898)
ccc = socket(AF_INET, SOCK_STREAM)
ccc.connect(address)
ccc.send("client" + str(1) + ":before time.sleep send1111\n")
time.sleep(0.001)
ccc.send("client2:222222 after time.sleep\n")# if sleep 0.0009,can received,but 0.001 can't

服務器是用Java編寫的:

 ReceiveListener listener = new ReceiveListener() {
            @Override
            public void onReceived(int clientId, String msg) {
                System.out.println(clientId + ":" + msg);
            }
        };
        ClientManager clientManager = ClientManager.getInstance(listener, 9898);
        clientManager.start();

這是類管理客戶端:

public class ClientManager {
    private static ServerThread serverThread = null;
    private static ClientManager instance = null;
    private final int port;
    private ReceiveListener receiveListener = null;

    private ClientManager(ReceiveListener receiveListener, int port) {
        this.receiveListener = receiveListener;
        this.port = port;
        serverThread = new ServerThread(receiveListener, port);
    }

    public static ClientManager getInstance(ReceiveListener receiveListener, int port) {
        if (instance == null) {
            synchronized (ClientManager.class) {
                if (instance == null) {
                    instance = new ClientManager(receiveListener, port);
                }
            }
        }
        return instance;
    }

    public void stop() {
        serverThread.Stop();
        serverThread = null;
    }

    public void start() {
        if (serverThread == null) {
            serverThread = new ServerThread(receiveListener, port);
        }
        new Thread(serverThread).start();
    }

    public static class ServerThread implements Runnable {
        private ReceiveListener receiveListener;
        private static Map<Integer, HandleMsgTask> tasks = new HashMap<>();
        private final AtomicBoolean isExit = new AtomicBoolean(false);
        private ServerSocket server;
        int i = 0;

        public ServerThread(ReceiveListener receiveListener, int port) {
            try {
                this.receiveListener = receiveListener;
                this.server = new ServerSocket(port);
            } catch (IOException e) {
                System.out.println("failed:" + e.getMessage());
            }
        }

        @Override
        public void run() {
            try {
                while (!isExit.get()) {
                    System.out.println("wait devices... ... " + i);
                    Socket client = server.accept();
                    HandleMsgTask task = new HandleMsgTask(i, client, receiveListener);
                    new Thread(task).start();
                    tasks.put(i, task);
                    i++;
                    System.out.println("No:" + i);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public static class HandleMsgTask implements Runnable {
            public final int clientId;
            public final Socket client;
            public static boolean connectStop = false;
            private final ReceiveListener ReceiveListener;

            public HandleMsgTask(int i, Socket client, ReceiveListener ReceiveListener) {
                this.clientId = i;
                this.client = client;
                this.ReceiveListener = ReceiveListener;
            }

            public void disconnectClient() {
                connectStop = true;
                try {
                    client.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void run() {
                try {
                    final String address = client.getRemoteSocketAddress().toString();
                    System.out.println(clientId + ":" + address);
                    InputStream inputStream = client.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                    while (reader.ready() && !connectStop) {
                        String line = reader.readLine();
                        if (ReceiveListener != null) {
                            ReceiveListener.onReceived(clientId, line);
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        public void Stop() {
            if (tasks != null) {
                for (HandleMsgTask task : tasks.values()) {
                    task.disconnectClient();
                }
                tasks.clear();
            }
            isExit.set(true);
            if (server != null) {
                try {
                    server.close();
                    System.out.println("close server");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

有人可以幫我嗎? 謝謝!

正如user207421所說,我濫用了ready(); 我更改下面的代碼並解決問題:編輯:

 while (!bIsStopped.get() && ((line = reader.readLine()) != null)) {
                    if (newMsgRecListener != null) {
                        newMsgRecListener.onMsgRec(clientId, line);
                    }
                }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM