Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 如何在swift中连接到套接字以读取和写入数据_Sockets_Swift - Fatal编程技术网

Sockets 如何在swift中连接到套接字以读取和写入数据

Sockets 如何在swift中连接到套接字以读取和写入数据,sockets,swift,Sockets,Swift,如何在swift中创建监听和写入的套接字?GCDAsyncSocket是一种正确的方法还是另一种可能的方法?我使用CFStreamCreatePairWithSocketToHost连接到套接字,但无法从中读取数据。您可以使用桥接到Swift的SocketRocket ObjC框架 然后您只需创建该类的一个实例并在Swift中使用它,即: var socket = SRWebSocket(...) socket.open() socket.send() socket.close() 根据用

如何在swift中创建监听和写入的套接字?GCDAsyncSocket是一种正确的方法还是另一种可能的方法?我使用CFStreamCreatePairWithSocketToHost连接到套接字,但无法从中读取数据。

您可以使用桥接到Swift的SocketRocket ObjC框架

然后您只需创建该类的一个实例并在Swift中使用它,即:

var socket = SRWebSocket(...)
socket.open()
socket.send()
socket.close()

根据用户要求,我附上桥接标题提示的屏幕截图:

还请记住将应用程序链接到libcucore.dylib:
我找到了斯威夫特的答案。我的应用程序代码是swift 2,服务器代码是java。我对swift插座有问题,但我找到了答案。这是我的问题链接和使用 我创建了自己的套接字类:

import Foundation
类SocketManager{

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实施感兴趣的人。 它被大量引用,并进行了一些编辑

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);
}

注意:raywnderlich的实现有一些变化,特别是在委托方法中。

在iOS或OS X中?您希望套接字打开并侦听连接,还是正在连接到现有主机并只想进行双向通信?在ios中,我希望套接字连接到现有主机,发送数据并侦听传入消息。只侦听@JeremyPope的连接如何?(对于OS X,objecitve-C)我正在尝试使用
CFStreamCreatePairWithSocketToHost
但是没有成功,只是“建立连接失败”(正是这一个:
Domain=NSPOSIXErrorDomain code=61“连接被拒绝”
没有http和
错误域=kCFErrorDomainCFNetwork code=2“(null)”用户信息={kcfgetAddressFailureKey=8}
使用“http:/localhost”)(主机:
@“localhost”
尝试使用
@”http://localhost“
不同的错误,但也没有成功)此线程非常旧,但对于来这里寻找最新Swift socket软件包的人来说,这可能是你想要的:另一种可能是:当然,我每天都在iOS应用程序中使用它。如果没有,我不会向你建议。在将此框架添加到“链接二进制与库”之后,我应该怎么做?帮助我。你不一定要这么做,只需将文件添加到文件夹中并使用它们即可。我将在回答中发布一个屏幕截图。谢谢,我必须在哪里设置我主机的ip地址和端口?套接字桥接头.h文件的内部是什么?它是您第一次使用ObjC代码编译时由Xcode自动创建的文件。这也可以用于监听数据吗?假设服务器发送一些字节数的数据,这个类怎么知道收到了数据?如果isSuccess{}station并且您必须读取数据私有func sendRequest(数据:String,客户端:TCPClient?->(String?),则使用func sendRequest()并获取结果数据。这个函数给您字符串,因此它是结果(接收的数据)这是否可用于打开和侦听本地Web服务器的oauth2环回调用?如何启用带有流套接字的代理?
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;
    }
}