这里用的是UDPsocket通信,需要注意数据包传输中的半包,粘包,与分包,注意包的长度,标识符等信息
iOS-swift
class UdpSocketVC: UIViewController, GCDAsyncUdpSocketDelegate {
var udpSoc: GCDAsyncUdpSocket? = nil;
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let msgDic: Dictionary<String, String> = ["msgType": "100","message":"testonline"];
self.clientSend(dict: msgDic);
}
//udp
func clientSend(dict: Dictionary<String, Any>) {
//init udp socket
udpSoc = GCDAsyncUdpSocket.init(delegate: self, delegateQueue: DispatchQueue.global());
//字典转json - data
// let sendData: Data = NSKeyedArchiver.archivedData(withRootObject: dict);
let sendData: Data = try! JSONSerialization.data(withJSONObject: dict, options: []);
udpSoc?.send(sendData, toHost: "192.168.3.24", port: 8936, withTimeout: -1, tag: 101);
// 开始监听 不然接收不到数据
try? udpSoc?.beginReceiving();
}
func clientReceiver(port: Int) {
try? udpSoc?.beginReceiving();
}
//链接失败
func udpSocket(_ sock: GCDAsyncUdpSocket, didNotConnect error: Error?) {
NSLog("-- didNotConnect --");
}
//在绑定address成功后回调
func udpSocket(_ sock: GCDAsyncUdpSocket, didConnectToAddress address: Data) {
NSLog("-- didConnectToAddress --");
}
// 发送数据后的回调 不关心是否成功发送
func udpSocket(_ sock: GCDAsyncUdpSocket, didSendDataWithTag tag: Int) {
NSLog("-- didSendDataWithTag --");
}
// 发送数据失败
func udpSocket(_ sock: GCDAsyncUdpSocket, didNotSendDataWithTag tag: Int, dueToError error: Error?) {
NSLog("-- didNotSendDataWithTag --");
}
// 关闭udp socket
func udpSocketDidClose(_ sock: GCDAsyncUdpSocket, withError error: Error?) {
NSLog("-- udpSocketDidClose --");
}
////////////////////////////////////////////////////////////////////////////////////
// 服务端接收到数据后,回调方法
func udpSocket(_ sock: GCDAsyncUdpSocket, didReceive data: Data, fromAddress address: Data, withFilterContext filterContext: Any?) {
let josnStr: String = String(data: data, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue))!;
NSLog("didReceive = " + josnStr);
}
java
ResponseMsg 这是java的一个响应的类,里面就几个属性
// 需要到一些jar包,JSONArray。。
public class S_UDPSocket {
public static void main(String[] args) {
// TODO Auto-generated method stub
new S_UDPSocket().udpReceiverData();
}
public void udpReceiverData(){
byte[] buf = new byte[1024];
DatagramPacket receiver_dp = new DatagramPacket(buf, 1024);
// 接收的udp socket
try {
DatagramSocket udp_soc = new DatagramSocket(8936);
System.out.println("我在监听 8936!");
//让他一直监听,
while(true){
// 接收到一条数据
udp_soc.receive(receiver_dp);
String receiveStr = new String(receiver_dp.getData(), 0, receiver_dp.getLength());
System.out.println("服务器接收到的数据: "+ receiveStr);
// 响应接收到的数据
ResponseMsg resMsg = new ResponseMsg();
resMsg.setMsgType(100);
resMsg.setStateCode(1);
resMsg.setMessage("on line");
JSONArray js = JSONArray.fromObject(resMsg);
System.out.println("getInetAddress:【"+ receiver_dp.getAddress() +"】getPort:["+receiver_dp.getPort()+" ]");
DatagramPacket send_dp = new DatagramPacket(js.toString().getBytes(), js.toString().length(), receiver_dp.getAddress(),receiver_dp.getPort());
// String s = "liyang";
// DatagramPacket send_dp = new DatagramPacket(s.getBytes(), s.length(), receiver_dp.getAddress(),receiver_dp.getPort());
udp_soc.send(send_dp);
//绑定 socket,可由于广播
// udp_soc.bind(addr);
// 设置长度
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}