【问题标题】:Client/Server program doesn't run in regular way客户端/服务器程序无法正常运行
【发布时间】:2016-08-26 16:10:15
【问题描述】:

此客户端服务器程序只运行一次,android 将字符串发送到服务器,服务器将其转发给 arduino。当我第一次发送时,arduino 收到了它,但是当我第二次发送时,服务器收到了它,但没有将它转发给 arduino。我看不到问题所在。如果有人可以帮助我,我将不胜感激..

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class server {

    private ServerSocket serverSocket;
    String type1;
    String type;
    Socket socket;
    Socket s;
    DataOutputStream dos;
    private ClientHandler c = new ClientHandler();
    private Connection con = new Connection();

    public server(int port) {
        try {
            serverSocket = new ServerSocket(port);
            new Connection().start();
            // new ClientHandler().start();
        } catch (IOException e) {}
    }

    private class Connection extends Thread {
        public void run() {
            //Socket socket;      
            while (true) {
                try {
                    socket = serverSocket.accept();
                    // DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
                    System.out.println("connected");
                    DataInputStream dis = new DataInputStream(socket.getInputStream());
                    type = dis.readUTF();
                    System.out.println("jag fick det från android: " + type);

                    new ClientHandler().start();
                    dis.close();
                    //c.run();      
                } catch (IOException e) {}
            }
        }
    }

    private class ClientHandler extends Thread {
        public void run() {
            //System.out.println("1");
            try {
                //   System.out.println("2");
                socket = serverSocket.accept();
                // System.out.println("3");
                System.out.println("got it");
                dos = new DataOutputStream(socket.getOutputStream());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            while (true) {
                try {

                    if (type == null) {
                        //break;
                        continue;
                    }
                    // System.out.println("4");
                    //DataInputStream dis1 = new     DataInputStream(s.getInputStream());
                    //type1 = dis1.readUTF();
                    //System.out.println("3");

                    dos.writeUTF(type);
                    System.out.println("jag fick det från ardunio: " + type);
                    //dos.flush();
                    //dos.close();
                    // con.run();
                    // type = null;
                    //socket.close();
                    break;
                    //continue;
                } catch (IOException e2) {}
            }
        }
    }

    public static void main(String[] args) {
        new server(3389);
        System.out.println(" Server startar");
    }
}

【问题讨论】:

  • 首先不要吞下异常......如果有什么引发了异常,你至少应该知道引发了异常,至少尝试打印它们。
  • 主耶稣那个缩进... xD
  • 我看不到编辑我不知道你为什么可以把它发给我?

标签: java multithreading sockets arduino server


【解决方案1】:

您只从套接字读取一次。 ClientHandler 应该在其循环中完成所有 I/O:在接受循环中不应该完成。

NB Connection 是一个接受循环类的糟糕名称。您不需要它作为数据成员。 Socket 和输入输出流应该是ClientHandler 的成员,而不是server 的成员。

【讨论】:

  • 你的意思是我将两个客户端的流和套接字移动到自己的类?
  • 这没有“意思”。我说过 ClientHandler 应该做所有的 I/O,并且套接字及其输入和输出流应该是 ClientHandler 的成员,而不是 server 的成员。你只是要我重复一遍。
猜你喜欢
  • 2018-05-19
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多