移动客户端与服务器通信方式二
2017-05-08 14:37
260 查看
今天说的是iOS端socket通信
在实际开发中有很多问题,eg:当网络环境发生变化时,移动端的ip发生变化,那么socket连接将会自动断开,这时需要一套完善的重连机制。(如果是udp,他的每个数据包都会有ip地址信息的)
iOS-swift版本
Java
需要注意的是我这里传输的数据都是json串,然后变成data进行传输的。注意转换哈
在实际开发中有很多问题,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(); } } }
相关文章推荐
- 移动客户端与服务器通信方式一
- 【转】Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- Android客户端与服务器通信方式浅谈
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- Socket 通信原理(Android客户端和服务器以TCP UDP方式互通)
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- android客户端向服务器通信的三种方式的使用
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)