您的位置:首页 > 其它

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

2017-05-08 14:37 260 查看
今天说的是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();
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  通信
相关文章推荐