如何连接到 swift 中的套接字以读取和写入数据
how connect to socket in swift to read data and write it
如何在swift中创建一个监听和写入的套接字? GCDAsyncSocket 是正确的方法还是其他方法?我使用 CFStreamCreatePairWithSocketToHost 连接到套接字但无法从中读取数据。
您可以使用桥接到 Swift
的 SocketRocket ObjC 框架
https://github.com/square/SocketRocket
然后您只需创建 class 的实例并在 Swift 中使用它,即:
var socket = SRWebSocket(...)
socket.open()
socket.send()
socket.close()
应用户要求,我附上桥接头提示的屏幕截图:
另外记得 link 您的应用程序反对 libcucore.dylib:
我找到了 swift 的答案。我的应用程序代码是 swift 2,服务器代码是 java。我在使用 swift 套接字时遇到问题,但我找到了答案。这是我的问题 link and use https://github.com/swiftsocket/SwiftSocket
我创建自己的套接字 class 这个:
import Foundation
class 套接字管理器 {
let socket : TCPClient
class var sharedInstance: SocketManager {
struct Singleton {
static let instance = SocketManager()
}
return Singleton.instance
}
init() {
// Create the socket
self.socket = TCPClient(addr: "www.apple.com", port: 9000)
// Connect the socket
let (success, msg )=self.socket.connect(timeout: 1)
print("\(msg) : \(success)")
}
internal func sendMessage(data: String){
let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
let request = self.sendRequest(data, client: self.socket)
print("received message: \(request)")
dispatch_async(dispatch_get_main_queue(), { () -> Void in
print("This is run on the main queue, after the previous code in outer block")
})
})
}
private func sendRequest(data: String, client: TCPClient?) -> (String?) {
// It use ufter connection
if client != nil {
// Send data (WE MUST ADD SENDING MESSAGE '\n' )
let (isSuccess, errorMessage) = client!.send(str: "\(data)\n")
if isSuccess {
// Read response data
let data = client!.read(1024*10)
if let d = data {
// Create String from response data
if let str = NSString(bytes: d, length: d.count, encoding: NSUTF8StringEncoding) as? String {
return (data: str)
} else {
return (data: nil)
}
} else {
return (data: nil)
}
} else {
print(errorMessage)
return (data: nil)
}
} else {
return (data: nil)
}
}
}
这样使用:
SocketManager.sharedInstance.sendMessage("Salom Hammaga")
对于那些对 Swift 3 实现感兴趣的人。
它被大量引用自 raywenderlich's example 并进行了一些编辑。
func connect() {
Stream.getStreamsToHost(withName: self.address!, port: self.port!, inputStream: &self.inputStream, outputStream: &self.outputStream);
guard let _ = inputStream, let _ = outputStream else {
// your own execption or otherwise
return;
}
self.inputStream?.delegate = self;
self.outputStream?.delegate = self;
self.inputStream?.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode);
self.outputStream?.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode);
self.inputStream?.open();
self.outputStream?.open();
}
func disconnect() {
if let stream = self.inputStream {
stream.close();
stream.remove(from: RunLoop.current, forMode: RunLoopMode.commonModes);
}
if let stream = self.outputStream {
stream.close();
stream.remove(from: RunLoop.current, forMode: RunLoopMode.commonModes);
}
self.inputStream = nil;
self.outputStream = nil;
}
func write(data:Data) {
let _ = data.withUnsafeBytes { (unsafePointer:UnsafePointer<UInt8>) in
let bytesWritten = self.outputStream?.write(unsafePointer, maxLength: data.count);
};
}
func readAvailableBytes(stream: InputStream) {
var buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: maxReadLength);
while stream.hasBytesAvailable {
let numberOfBytesRead = stream.read(buffer, maxLength: maxReadLength)
if numberOfBytesRead < 0 {
if let _ = stream.streamError {
break
}
}
//Construct the Message object
if(numberOfBytesRead > 0){
let output = String(cString:buffer)
NSLog("server said: %@", output)
} else {
NSLog("empty string from stream")
}
}
buffer.deallocate(capacity: maxReadLength);
}
并确保在处理过程中实现 StreamDelegate 和委托方法 class:
func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
NSLog("Receieve stream event: %d", eventCode.rawValue);
switch (eventCode){
case Stream.Event.errorOccurred:
NSLog("ErrorOccurred")
break;
case Stream.Event.endEncountered:
NSLog("EndEncountered")
break;
case Stream.Event.hasBytesAvailable:
NSLog("HasBytesAvaible");
break;
case Stream.Event.openCompleted:
NSLog("OpenCompleted");
break;
case Stream.Event.hasSpaceAvailable:
NSLog("HasSpaceAvailable");
break;
default:
NSLog("default reached. unknown stream event")
break;
}
}
注意:raywnderlich 的实现有一些变化,特别是在委托方法中。
如何在swift中创建一个监听和写入的套接字? GCDAsyncSocket 是正确的方法还是其他方法?我使用 CFStreamCreatePairWithSocketToHost 连接到套接字但无法从中读取数据。
您可以使用桥接到 Swift
的 SocketRocket ObjC 框架https://github.com/square/SocketRocket
然后您只需创建 class 的实例并在 Swift 中使用它,即:
var socket = SRWebSocket(...)
socket.open()
socket.send()
socket.close()
应用户要求,我附上桥接头提示的屏幕截图:
另外记得 link 您的应用程序反对 libcucore.dylib:
我找到了 swift 的答案。我的应用程序代码是 swift 2,服务器代码是 java。我在使用 swift 套接字时遇到问题,但我找到了答案。这是我的问题 link
import Foundation
class 套接字管理器 {
let socket : TCPClient
class var sharedInstance: SocketManager {
struct Singleton {
static let instance = SocketManager()
}
return Singleton.instance
}
init() {
// Create the socket
self.socket = TCPClient(addr: "www.apple.com", port: 9000)
// Connect the socket
let (success, msg )=self.socket.connect(timeout: 1)
print("\(msg) : \(success)")
}
internal func sendMessage(data: String){
let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
let request = self.sendRequest(data, client: self.socket)
print("received message: \(request)")
dispatch_async(dispatch_get_main_queue(), { () -> Void in
print("This is run on the main queue, after the previous code in outer block")
})
})
}
private func sendRequest(data: String, client: TCPClient?) -> (String?) {
// It use ufter connection
if client != nil {
// Send data (WE MUST ADD SENDING MESSAGE '\n' )
let (isSuccess, errorMessage) = client!.send(str: "\(data)\n")
if isSuccess {
// Read response data
let data = client!.read(1024*10)
if let d = data {
// Create String from response data
if let str = NSString(bytes: d, length: d.count, encoding: NSUTF8StringEncoding) as? String {
return (data: str)
} else {
return (data: nil)
}
} else {
return (data: nil)
}
} else {
print(errorMessage)
return (data: nil)
}
} else {
return (data: nil)
}
}
}
这样使用:
SocketManager.sharedInstance.sendMessage("Salom Hammaga")
对于那些对 Swift 3 实现感兴趣的人。 它被大量引用自 raywenderlich's example 并进行了一些编辑。
func connect() {
Stream.getStreamsToHost(withName: self.address!, port: self.port!, inputStream: &self.inputStream, outputStream: &self.outputStream);
guard let _ = inputStream, let _ = outputStream else {
// your own execption or otherwise
return;
}
self.inputStream?.delegate = self;
self.outputStream?.delegate = self;
self.inputStream?.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode);
self.outputStream?.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode);
self.inputStream?.open();
self.outputStream?.open();
}
func disconnect() {
if let stream = self.inputStream {
stream.close();
stream.remove(from: RunLoop.current, forMode: RunLoopMode.commonModes);
}
if let stream = self.outputStream {
stream.close();
stream.remove(from: RunLoop.current, forMode: RunLoopMode.commonModes);
}
self.inputStream = nil;
self.outputStream = nil;
}
func write(data:Data) {
let _ = data.withUnsafeBytes { (unsafePointer:UnsafePointer<UInt8>) in
let bytesWritten = self.outputStream?.write(unsafePointer, maxLength: data.count);
};
}
func readAvailableBytes(stream: InputStream) {
var buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: maxReadLength);
while stream.hasBytesAvailable {
let numberOfBytesRead = stream.read(buffer, maxLength: maxReadLength)
if numberOfBytesRead < 0 {
if let _ = stream.streamError {
break
}
}
//Construct the Message object
if(numberOfBytesRead > 0){
let output = String(cString:buffer)
NSLog("server said: %@", output)
} else {
NSLog("empty string from stream")
}
}
buffer.deallocate(capacity: maxReadLength);
}
并确保在处理过程中实现 StreamDelegate 和委托方法 class:
func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
NSLog("Receieve stream event: %d", eventCode.rawValue);
switch (eventCode){
case Stream.Event.errorOccurred:
NSLog("ErrorOccurred")
break;
case Stream.Event.endEncountered:
NSLog("EndEncountered")
break;
case Stream.Event.hasBytesAvailable:
NSLog("HasBytesAvaible");
break;
case Stream.Event.openCompleted:
NSLog("OpenCompleted");
break;
case Stream.Event.hasSpaceAvailable:
NSLog("HasSpaceAvailable");
break;
default:
NSLog("default reached. unknown stream event")
break;
}
}
注意:raywnderlich 的实现有一些变化,特别是在委托方法中。