소켓 통신을 통해이 클래스
class SocketManager: NSObject, StreamDelegate {
var serverAddress: CFString
let serverPort: UInt32 = 6000
private var inputStream: InputStream!
private var outputStream: OutputStream!
private var connecting:Bool
init(ip:String) {
serverAddress = ip as CFString
connecting = false
super.init()
connect()
}
func disconect(){
outputStream.close()
inputStream.close()
}
func connect() {
connecting = true
while connecting {
print("connecting...")
var readStream: Unmanaged<CFReadStream>?
var writeStream: Unmanaged<CFWriteStream>?
CFStreamCreatePairWithSocketToHost(nil, self.serverAddress, self.serverPort, &readStream, &writeStream)
inputStream = readStream!.takeRetainedValue()
outputStream = writeStream!.takeRetainedValue()
inputStream.delegate = self
outputStream.delegate = self
inputStream.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)
outputStream.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)
inputStream.open()
outputStream.open()
connecting = false
}
}
public func sendMsg(msg : String){
let data = msg.data(using: String.Encoding.utf8)!
// Write to output stream:
_ = data.withUnsafeBytes { outputStream.write($0, maxLength: data.count) }
}
public func Receive(){
let bufferSize = 81600
var buffer = Array<UInt8>(repeating: 0, count: bufferSize)
let bytesRead = inputStream.read(&buffer, maxLength: bufferSize)
if bytesRead >= 0 {
let output = NSString(bytes: &buffer, length: bytesRead, encoding: String.Encoding.utf8.rawValue)
DispatchQueue.global(qos: .background).async {
GlobalFunction.GVsharedInstance.Parser(msg: output as! String)
}
}
}
}
을 시도, 소켓은 일반적으로 열려하고 여러 개의 메시지를 보내십시오. 다른 쪽 끝은 당신이 만든 첫 번째 연결을 계속 듣고있는 것 같습니다. 나는 당신이 여기에서'connect' 메소드를 꺼내서 열린 커넥션을 속성에 저장하고자한다고 생각합니다. 그렇지 않으면 매번 연결을 끊어야하는데 이는 그리 효율적이지 않습니다. –
@DaveWeston 어떻게 이런 생각을하지 않았습니까? 그게 내 문제를 고쳤어, 많이 고마워! – Skoua
여러분을 환영합니다! –