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