SocketServer

//服務器端口

varport =6666

//客戶端管理類

classChatUser:NSObject{

vartcpClient:TCPClient?

varusername:String=""

varsocketServer:MyServer?

//解析接收到的消息

funcreadMsg()->NSDictionary?{

//read 4 byte int as type

ifletdata=self.tcpClient!.read(4){

ifdata.count==4{

letndata=NSData(bytes: data, length: data.count)

varlen:Int32=0

ndata.getBytes(&len, length: data.count)

ifletbuff=self.tcpClient!.read(Int(len)){

letmsgd:NSData=NSData(bytes: buff, length: buff.count)

letmsgi:NSDictionary=(try!

NSJSONSerialization.JSONObjectWithData(msgd,

options: .MutableContainers))as!NSDictionary

returnmsgi

}

}

}

returnnil

}

//循環(huán)接收消息

funcmessageloop(){

whiletrue{

ifletmsg=self.readMsg(){

self.processMsg(msg)

}else{

self.removeme()

break

}

}

}

//處理收到的消息

funcprocessMsg(msg:NSDictionary){

ifmsg["cmd"]as!String=="nickname"{

self.username= msg["nickname"]as!String

}

self.socketServer!.processUserMsg(user:self, msg: msg)

}

//發(fā)送消息

funcsendMsg(msg:NSDictionary){

letjsondata=try?NSJSONSerialization.dataWithJSONObject(msg, options:

NSJSONWritingOptions.PrettyPrinted)

varlen:Int32=Int32(jsondata!.length)

letdata:NSMutableData=NSMutableData(bytes: &len, length:4)

self.tcpClient!.send(data: data)

self.tcpClient!.send(data: jsondata!)

}

//移除該客戶端

funcremoveme(){

self.socketServer!.removeUser(self)

}

//關閉連接

funckill(){

self.tcpClient!.close()

}

}

//服務端

classMyServer:NSObject{

varclients:[ChatUser] = []

varserver:TCPServer=TCPServer(addr:"192.168.224.48", port:port)//127.0.0.1

varserverRuning:Bool=false

//啟動服務

funcstart() {

server.listen()

self.serverRuning=true

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), {

whileself.serverRuning{

letclient=self.server.accept()

ifletc=client{

dispatch_async(

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), {

self.handleClient(c)

})

}

}

})

self.log("server started...")

}

//停止服務

funcstop() {

self.serverRuning=false

self.server.close()

//forth close all client socket

forc:ChatUserinself.clients{

c.kill()

}

self.log("server stoped...")

}

//處理連接的客戶端

funchandleClient(c:TCPClient){

self.log("new client from:"+c.addr)

letu=ChatUser()

u.tcpClient= c

clients.append(u)

u.socketServer=self

u.messageloop()

}

//處理各消息命令

funcprocessUserMsg(user u:ChatUser,msg m:NSDictionary){

self.log("\(u.username)[\(u.tcpClient!.addr)]cmd:"+(m["cmd"]as!String))

//boardcast message

varmsgtosend=[String:String]()

letcmd = m["cmd"]as!String

ifcmd=="nickname"{

msgtosend["cmd"]="join"

msgtosend["nickname"]=u.username

msgtosend["addr"]=u.tcpClient!.addr

}elseif(cmd=="msg"){

msgtosend["cmd"]="msg"

msgtosend["from"]=u.username

msgtosend["content"]=(m["content"]as!String)

}elseif(cmd=="leave"){

msgtosend["cmd"]="leave"

msgtosend["nickname"]=u.username

msgtosend["addr"]=u.tcpClient!.addr

}elseif(cmd=="setFont_color"){

msgtosend["cmd"]="setFont_color"

msgtosend["font"]=m["fontSize"]as?String

msgtosend["r"]=m["r"]as?String

msgtosend["g"]=m["g"]as?String

msgtosend["b"]=m["b"]as?String

msgtosend["Username"]=m["Username"]as?String

//msgtosend["color"]=

}

foruser:ChatUserinself.clients{

//if u~=user{

print(msgtosend)

user.sendMsg(msgtosend)

//}

}

}

//移除用戶

funcremoveUser(u:ChatUser){

self.log("remove user\(u.tcpClient!.addr)")

ifletpossibleIndex=self.clients.indexOf(u){

self.clients.removeAtIndex(possibleIndex)

self.processUserMsg(user: u, msg: ["cmd":"leave"])

}

}

//日志打印

funclog(msg:String){

print(msg)

}

}

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • (本文代碼已升級至Swift3) 在Swift開發(fā)中,如果我們需要保持客服端和服務器的長連接進行雙向的數(shù)據(jù)通信,使...
    F麥子閱讀 2,140評論 8 1
  • /*初始化客戶端,并連接服務器*/ func connectServer(addr: String,port: I...
    changeL閱讀 1,546評論 1 0
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,101評論 0 9
  • *7月8日上午 N:Block :跟一個函數(shù)塊差不多,會對里面所有的內(nèi)容的引用計數(shù)+1,想要解決就用__block...
    炙冰閱讀 2,751評論 1 14
  • 有時總泛濫著這樣的一種感覺,相處就好像是吃榴蓮那樣,嘗著它的香又聞著它的臭。不管是怎樣的人,相處起來就有那...
    歡樂的小路閱讀 366評論 0 2

友情鏈接更多精彩內(nèi)容