//
// ViewController.swift
// socket练习-聊天室客户端
//
// Created by admin on 16/3/16.
// Copyright © 2016年 jin. All rights reserved.
//
import UIKit
class ViewController: UIViewController,NSStreamDelegate,UITableViewDelegate,UITableViewDataSource {
@IBOutlet weak var messageTableView: UITableView!
@IBOutlet weak var messageTextField: UITextField!
var inputStream:NSInputStream?
var outputStream:NSOutputStream!
override func viewDidLoad() {
super.viewDidLoad()
self.messageTableView.delegate = self
self.messageTableView.dataSource = self
}
// 建立连接
@IBAction func connection(sender: UIBarButtonItem) {
//ios里实现sokcet的连接,使用C语言
// 1.与服务器通过三次握手建立连接
let host:CFString = "127.0.0.1"
let port:UInt32 = 52013
// 2.定义输入输出流
var readStream:Unmanaged<CFReadStream>?
var writeStream:Unmanaged<CFWriteStream>?
// 3.分配输入输出流的内存空间
// CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host, port, &readStream, &writeStream)
// 4.把C语言的输入输出流转成OC对象
self.inputStream = readStream?.takeRetainedValue()
self.outputStream = writeStream!.takeUnretainedValue()
// _inputStream = (__bridge NSInputStream *)readStream;
// _outputSteam = (__bridge NSOutputStream *)(writeStream);
//
// 5.设置代理,监听数据接收的状态
self.inputStream?.delegate = self
self.outputStream?.delegate = self
// 把输入输入流添加到主运行循环(RunLoop)
// 主运行循环是监听网络状态
self.inputStream?.scheduleInRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)
self.outputStream?.scheduleInRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)
// 6.打开输入输出流
self.inputStream?.open()
self.outputStream.open()
}
@IBAction func login(sender: UIBarButtonItem) {
let str = "login:zhangsan"
self.sendData(str)
let res = self.readData()
print(res)
}
var messages:[NSString] = []
@IBAction func sendMessage(sender: UITextField) {
let message:NSString = sender.text!
if(message.length > 0)
{
self.sendData("message:\(message)")
let res = self.readData()
self.messages.append(res)
self.messageTableView.reloadData()
}
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return self.messages.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("MessageCell")
cell?.textLabel?.text = self.messages[indexPath.row] as String
return cell!
}
// 代理方法,在不同的状态会调用这个方法
func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {
switch(eventCode)
{
case NSStreamEvent.OpenCompleted:
print("建立连接成功,形成输入输出流通道")
break
case NSStreamEvent.HasBytesAvailable:
print("可以读取数据")
break
case NSStreamEvent.HasSpaceAvailable:
print("可以发送数据")
break
case NSStreamEvent.ErrorOccurred:
print("发生错误")
break
case NSStreamEvent.EndEncountered:
print("正常断开连接")
// 关闭输入输出流,并从主运行循环中移除
self.inputStream?.close()
self.inputStream?.removeFromRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)
self.outputStream.close()
self.outputStream?.removeFromRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)
break
default:
break
}
}
// 发送数据
func sendData(dataString:NSString)
{
let data:NSData = dataString.dataUsingEncoding(NSUTF8StringEncoding)!
self.outputStream.write(UnsafePointer<UInt8>(data.bytes), maxLength: data.length)
}
func readData()->NSString
{
var buffer = [UInt8](count: 1024, repeatedValue: 0)
let len = self.inputStream?.read(&buffer, maxLength: buffer.count)
var res:NSString = ""
//
if len > 0
{
res = NSString(bytes: buffer, length: buffer.count, encoding: NSUTF8StringEncoding)!
}
return res
}
}