java socket 通信,用于各种无线网络通信

无论是使用Wi-Fi模块在单片机和电脑或手机之间进行数据传输,基本方法都是:

一台设备建立服务端,一台设备作为客户端连接,连接成功后即可进行通信。

一、服务端的建立

Java中建立服务端,不局限于电脑才能建立,一台手机同样可以建立:

 
    /**
     * 建立服务端
     *
     * @param sp 建立服务端的通信端口
     */
    private static void StartServer(int sp) {
        try {
            serverSocket = new ServerSocket(sp);   //服务端使用ServerSocket建立
            System.out.println("Server started at:" + InetAddress.getLocalHost());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        new Thread(){
            @Override
            public void run() {
                while (SERVER_ENABLE) { //循环监听
                    try {
                        s = serverSocket.accept(); //在有客户端连入之前,while循环将一直卡在这里
                        new MasterServerThread(s).start(); //客户端连接成功后,开启一个自定义的服务器线程
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }

二、服务线程

  
    /**
     * 服务器主线程
     */
    private static class MasterServerThread extends Thread {

        Socket masterSocket = null; //传入的客户端Socket
        String socketKind = null;

        //构造方法,在实例化本Class时要求传入客户端的socket
        public MasterServerThread(Socket s) {
            this.masterSocket = s;
        }

        @Override
        public void run() {
            BufferedReader bre = null;
            try {
                bre = new BufferedReader(new InputStreamReader(masterSocket.getInputStream(), "utf-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                while ((socketKind = bre.readLine()) != null) { //接收读取传输过来的数据 
                    //根据发过来的数据是什么,决定进行指定操作        
                     if (socketKind.contains(LOGIN_REQUEST)) {//TODO 处理登陆请求操作
                           //......
                     } else if (socketKind.contains(OPERATION_OF_BINDING_DEVICE)) {//TODO 处理设备绑定
                           //......
                     }                 
                }
            } catch (Exception e) {
                //e.printStackTrace();
            }
        }
    }

三、客户端的连接

/**
*    SERVER_IP : String型
*  SERVER_PORT :int型
*/

Socket socket = new Socket(SERVER_IP, SERVER_PORT); //服务端用的ServerSocket,客户端对应的是使用Socket
ClientThread ct = new ClientThread(socket);  //同样开启客户端线程,与服务器通信用
ct.start();

四、客户端线程

 
    /**
     * Class : ClientThread
     * 与服务端线程class十分相像
     */
    private class ClientThread extends Thread {
        Socket cSocket;
        BufferedReader br;

        public ClientThread(Socket s) {
            this.cSocket = s;
        }

        @Override
        public void run() {
            try {
                br = new BufferedReader(new InputStreamReader(cSocket.getInputStream(), "UTF-8"));
                while ((temp = br.readLine()) != null) {
                    //Do Something...
                   }
            }catch(IOException e){
                e.printStackTrace();
            }

        }
    }

五、发送消息

 /**
     * 发送登陆信息
     * @param id 用户ID
     * @param pwd 账号密码
     */
    private void sendLoginMsg(final String id, final String pwd) {

        new Thread() {
            @Override
            public void run() {
                try {
                    PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
                    printWriter.println(LOGIN_REQUEST + "CONNECTION_FROM_APP" + "_" + id + "$" + pwd + "&");
                    printWriter.flush();
                } catch (IOException e) {
                    e.printStackTrace();

                }
            }
        }.start();


    }

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值