移动客户端与服务器通信方式二

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pk_sir/article/details/71412144

今天说的是iOS端socket通信
在实际开发中有很多问题,eg:当网络环境发生变化时,移动端的ip发生变化,那么socket连接将会自动断开,这时需要一套完善的重连机制。(如果是udp,他的每个数据包都会有ip地址信息的)
iOS-swift版本

    var socket: GCDAsyncSocket? = nil;

    override func viewDidLoad() {
        super.viewDidLoad();
        socket = GCDAsyncSocket.init(delegate: self, delegateQueue: DispatchQueue.global());

        // 这里和Java一样,要捕捉异常
        do {
            try socket?.connect(toHost: "192.168.3.24", onPort: 8934, withTimeout: 100);
        } catch  { }


    }

    //
    func socket(_ sock: GCDAsyncSocket, didWriteDataWithTag tag: Int) {
        NSLog("- didWriteDataWithTag -");
        sock.readData(withTimeout: 100, tag: 101);

    }

    // 这是socket  的读消息的回调。如果服务器给这个socket 写消息,那么这里就会接受到消息,
    func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) {

        let str: String = String(data: data, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue))!;
        NSLog(" 返回的Json = " + str);

    }

    // 看名字就是 不能连接时的 回调
    func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {
        NSLog("- socketDidDisconnect -");
    }

    // 这是连接成功后的回调
    func socket(_ sock: GCDAsyncSocket, didConnectToHost host: String, port: UInt16) {
        NSLog("- didConnectToHost -");
        // 设置时间
        sock.readData(withTimeout: 1000, tag: 101);
    }


    // 这是手动发送消息,我的消息是一个 json 串
    @IBAction func sendMsg(_ sender: Any) {
        let msgDic: Dictionary<String, String> = ["msgType": "100","message":"testonline"];
        socket?.write(jsonStringFormDict(dict: msgDic), withTimeout: 100, tag: 101);
    }

    // 字典 转 json data
    func jsonStringFormDict(dict: Dictionary<String, Any>) -> Data {
        if !JSONSerialization.isValidJSONObject(dict) {
            NSLog("转josn 失败!");
        }
        var jsonData: Data = try! JSONSerialization.data(withJSONObject: dict, options: []);
        let str: String = String.init(data: jsonData, encoding: String.Encoding.utf8
            )!;
        NSLog("json = "+str);
        jsonData.append("\n".data(using: String.Encoding.utf8)!);
        return jsonData;


    }

Java
需要注意的是我这里传输的数据都是json串,然后变成data进行传输的。注意转换哈


public class S_ServerSocket {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new S_ServerSocket().listeningSocket();
    }

    ServerSocket serSoc= null;
    Socket soc = null;
    //监听 端口 8934
    public void listeningSocket(){
        try {
            this.serSoc = new ServerSocket(8934);
            System.out.println("在监听:8934");


            soc = this.serSoc.accept();                     
            InputStreamReader isr = new InputStreamReader(soc.getInputStream());
            BufferedReader br = new BufferedReader(isr);
            String str,totle = "";
            while((str = br.readLine() )!= null){
                totle += str;
                System.out.println("客户端发过来的内容: " + str);
                List<String> l = new ArrayList<>();
                l.add(totle);
                 JSONArray new_jsonArray=JSONArray.fromObject(l);  
                    Collection java_collection=JSONArray.toCollection(new_jsonArray);  
                  ResponseMsg msg= null;
                    if(java_collection!=null && !java_collection.isEmpty())  
                    {  
                        Iterator it=java_collection.iterator();  
                        while(it.hasNext())  
                        {  
                            JSONObject jsonObj=JSONObject.fromObject(it.next());  
                            msg=(ResponseMsg) JSONObject.toBean(jsonObj,ResponseMsg.class);  

                        }  
                    }  

                    System.out.println("msg="+ msg.getMsgType());
                    // 心跳包 维护在线 直接回复在线
                    if(msg.getMsgType() == 100){
                        OutputStreamWriter osw = new OutputStreamWriter(soc.getOutputStream());

                        ResponseMsg resMsg = new ResponseMsg();
                        resMsg.setMsgType(100);
                        resMsg.setStateCode(1);
                        resMsg.setMessage("on line");
                        JSONArray js = JSONArray.fromObject(resMsg);
                        osw.write(js.toString());
                        System.out.println("ja = "+ js.toString());
                        //关闭当前输出流  close() 是关闭该socket 流!!
                        osw.flush();

//                      ObjectOutputStream oos = new ObjectOutputStream(soc.getOutputStream());
//                      oos.writeObject(js);
                    }

            }


//          DataInputStream ds = new DataInputStream(soc.getInputStream());
//          String clientInputStr = ds.readUTF();
//          System.out.println("客户端发过来的内容:" + clientInputStr); 


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }
}

猜你喜欢

转载自blog.csdn.net/pk_sir/article/details/71412144