मैं टेलनेट को कमांड भेजने के लिए स्विफ्ट स्निपेट लिखने की कोशिश करता हूं लेकिन मुझे पहले लॉग इन करने की आवश्यकता है।टेलनेट खाली आउटपुट और लॉगिन/पासवर्ड अनुपस्थित हो जाता है
ओएसएक्स पर मैंने एक टेलनेट सेवा उत्पन्न की: launchctl load -F /System/Library/LaunchDaemons/telnet.plist
। इसके बाद मैं अन्य कंप्यूटरों से आईपी में कनेक्ट करने में सक्षम हूं: XXX.XXX.X.XXX
पोर्ट 23
।
उदाहरण के लिए:
telnet XXX.XXX.X.XXX 23
.....
Darwin/BSD (fess.local) (ttys009)
login: snaggs
Password:xxxxxx
snaggs:~ lur$
कमांड लाइन में, टेलनेट उपयोगकर्ता और पासवर्ड के लिए मुझे पूछता है। इसके बाद मैं किसी भी लिनक्स कमांड चला सकता हूं। अब तक सब ठीक है।
मैंने एंड्रॉइड के लिए टेलनेट मॉड्यूल लिखा है ताकि ओएसएक्स टेलनेट सेवा ठीक से काम करे। इसका मतलब है कि मैं login:
और password:
आउटपुट देखता हूं इसलिए मैं इसे संभालने में सक्षम हूं।
अब मैं आईओएस स्विफ्ट के साथ फंस कर रहा हूँ, मैं Google पर और बहुत अच्छा समाधान है कि मेरे मामले में काम करना चाहिए पाया:
तो मैं अपने घर काम लिखा था :
class TelnetClient : NSObject, NSStreamDelegate{
private var inputStream: NSInputStream!
private var outputStream: NSOutputStream!
func initNetworkCommunication(){
let host : CFString = "XXX.XXX.X.XXX"
let port : UInt32 = 23
var readstream : Unmanaged<CFReadStream>?
var writestream : Unmanaged<CFWriteStream>?
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host, port, &readstream, &writestream)
// var _inputStream: NSInputStream?
// var _outputStream: NSOutputStream?
// NSStream.getStreamsToHostWithName("XXX.XXX.X.XXX", port: 23, inputStream: &_inputStream, outputStream: &_outputStream)
// self.inputStream = _inputStream!
// self.outputStream = _outputStream!
self.inputStream = readstream!.takeRetainedValue()
self.outputStream = writestream!.takeRetainedValue()
self.inputStream.delegate = self
self.outputStream.delegate = self
self.inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
self.outputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
self.inputStream.open()
self.outputStream.open()
}
func sendMessage(message:String){
let data: NSData = message.dataUsingEncoding(NSASCIIStringEncoding, allowLossyConversion: true)! //NSUTF8StringEncoding
let stream: NSInputStream = NSInputStream(data: data)
var buffer = [UInt8](count: 8, repeatedValue: 0)
stream.open()
if stream.hasBytesAvailable {
let result :Int = stream.read(&buffer, maxLength: buffer.count)
}
self.outputStream.write(&buffer, maxLength: buffer.count)
println("wrote to Server: \(message)")
}
}
स्ट्रीम कॉलबैक मेथ ओवरराइड NSStreamDelegate
से आयुध डिपो:
func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {
switch (eventCode){
case NSStreamEvent.ErrorOccurred:
NSLog("ErrorOccurred")
break
case NSStreamEvent.EndEncountered:
NSLog("EndEncountered")
break
case NSStreamEvent.None:
NSLog("None")
break
case NSStreamEvent.HasBytesAvailable:
NSLog("HasBytesAvaible")
// ... NEVER ENTERS HERE
var buffer = [UInt8](count: 4096, repeatedValue: 0)
if (aStream == self.inputStream){
while (self.inputStream.hasBytesAvailable){
var len = self.inputStream.read(&buffer, maxLength: buffer.count)
if(len > 0){
var output = NSString(bytes: &buffer, length: buffer.count, encoding: NSUTF8StringEncoding)
if (output != ""){
NSLog("server said: %@", output!)
}
}
}
}
break
//case NSStreamEvent.allZeros:
// NSLog("allZeros")
// break
case NSStreamEvent.OpenCompleted:
NSLog("OpenCompleted") // <-- called on initialisation
break
case NSStreamEvent.HasSpaceAvailable:
NSLog("HasSpaceAvailable")
break
default:
NSLog("default")
break
}
}
सबसे पहले, कुछ भी नहीं होता है जब मैं initNetworkCommunication()
कॉल करने के लिए प्रयास करें। मुझे func stream
पर कॉल करने की उम्मीद है या मैं गलत हूं?। यह NSStreamEvent.HasBytesAvailable
राज्य होना चाहिए या मैं गलत हूँ?
जब मैं sendMessage("snags")
कहते हैं, मैं stream
कि case NSStreamEvent.HasSpaceAvailable
पर पड़ता है में प्रतिक्रिया मिल। इसका क्या अर्थ है?
मेरे अपेक्षित परिणाम: कनेक्ट होने पर मैं login:
उत्पादन मिलता है लेकिन कुछ भी नहीं मिलना चाहिए।
@Brian कारण है कि आप शीर्षक से 'स्विफ्ट iOS' को दूर किया? यह प्रश्न आईओएस स्विफ्ट को संदर्भित करता है और सटीक टेलनेट – snaggs
शीर्षक में टैग शामिल करना अनावश्यक है और अव्यवस्था बनाता है। टैग सुनिश्चित करेंगे कि यह स्पष्ट है कि विषय क्या हैं। आप [इस मेटा प्रश्न] में अधिक पढ़ सकते हैं (http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles)। – Brian
NSStream आप सिर दर्द का एक बहुत, मैं वास्तव में रोबी हैन्सन द्वारा तीसरे पक्ष के ढांचे की तरह [CocoaAsyncSocket] (https://github.com/robbiehanson/CocoaAsyncSocket) उपयोग करने की अनुशंसा दे देंगे, आपको बस इतना करना है शामिल है 'GCDAsyncSocket.h 'आपके' पुल-हेडर.h' – Xrait