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

来源:互联网 发布:阿里云学生机有啥用 编辑:程序博客网 时间:2024/04/28 10:51

今天说的是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();        }    }}
0 0