Arthur_王 2014-08-25 08:39 采纳率: 0%
浏览 2919

Android Socket服务器线程问题

急!急!急!我是搞java得由于公司有个项目没有android人手,让我做了一个app。马上就要交付测试了,现在遇到这样的问题:启动Android Socket服务端时报错说不让在主线程启动,找了一下相关资料说将线程启动到后台可是不知道怎么改,这是我的代码。

ServerSocket server;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final Button bt_action = (Button) findViewById(R.id.bt_action);

    bt_action.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            try {
                ServerSocket server = new ServerSocket();
                while (true) {
                    // 未连通前线程阻塞,连通后开启一个socket通道线程后继续监听9999端口
                    Socket socket = server.accept();
                    System.out.println(socket.getInetAddress()
                            .getHostAddress() + "连接进入");
                    new SocketThread(socket).start();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    });
}

// 一个服务器端口中监听多个客服端通道线程
class SocketThread extends Thread {
    // 所有通道写入流的集合
    private final List<PrintWriter> list = new ArrayList<PrintWriter>();

    private BufferedReader bufferedReader;
    private PrintWriter printWriter;
    InputStream in = null;

    public SocketThread(Socket socket) throws IOException {
        this.bufferedReader = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));
        this.printWriter = new PrintWriter(socket.getOutputStream());
        this.in = socket.getInputStream();
        list.add(printWriter);
    }

    @Override
    public void run() {
        String string = null;
        while (true) {
            try {
                // 服务器在通道中读到的信息回显给客服端
                string = bufferedReader.readLine();
                System.out.println("客服端信息:" + string);
                for (PrintWriter printWriter : list) {
                    // printWriter.write("服务器显示:" + string + "\r\n");
                    printWriter.flush();
                }
            } catch (IOException e) {
            }
        }
    }
}
  • 写回答

2条回答 默认 最新

  • HDinger 2015-04-02 11:56
    关注

    new Thread(new Runnable() {
    @Override
    public void run() {
    ServerSocket server = new ServerSocket();
    while (true) {
    // 未连通前线程阻塞,连通后开启一个socket通道线程后继续监听9999端口
    Socket socket = server.accept();
    System.out.println(socket.getInetAddress()
    .getHostAddress() + "连接进入");
    new SocketThread(socket).start();
    }
    }
    }.start();
    这样就好了

    评论

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮