客户端/服务器程序不以常规方式运行

时间:2016-05-01 23:40:02

标签: java multithreading sockets arduino server

这个客户端服务器程序只运行一次,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");
    }
}

1 个答案:

答案 0 :(得分:0)

您只能从套接字读取一次。 ClientHandler应该在其循环中执行所有I / O:在accept循环中不应该完成任何操作。

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