iOS 最简单socket 通讯
已在谈到关于socket 但是实际开发的工作中没有用到. 忘记的差不多, 今天做练习特此记录一下
server 服务搭建
我使用的是python3 实现我的服务端
import socket
import threading
print("watting to be connected ....")
HostPort = ('127.0.0.1', 6666) # 绑定端口号 6666
s = socket.socket(socket.AF_INEF, socket.SOCK_STREAM)
s.bind(HostPort)
s.listen(1)
conn, addr = s.accept()
true = True
addr = str(addr)
print('连接到 : %s', %addr);
def Receve(conn): # 将接收定义成一个函数
global true # 声明全局变量,当接收到的消息为quit时,则触发全局变量 true = False,则会将socket关闭
while true:
data = conn.recv(1024).decode('utf8')
if len(data) > 0 :
print("you have receve: " + data + " from" + addr)
if data == 'quit':
true=False
# 当接收的值为'quit'时,退出接收线程,否则,循环接收并打印
thrd=threading.Thread(target=Receve,args=(conn,)) # 线程实例化,target为方法,args为方法的参数
thrd.start() # 启动线程
while true:
user_input = input('>>>')
conn.send(user_input.encode('utf8')) # 循环发送消息
if user_input == 'quit': # 当发送为‘quit’时,关闭socket
true = False
#conn.close()
s.close()
iOS 客户端
// 导入 socket 代理
@interface ViewController ()<NSStreamDelegate>{
NSInputStream *_inputStream; // 对应的输入流
NSOutputStream *_outputStream; //对应的输出流
}
// 加载socket
- (void)loadSocket
{
NSString *host = @"127.0.0.1";
int port = 9999;
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);
_inputStream = (__bridge NSInputStream *)(readStream);
_outputStream = (__bridge NSOutputStream *)(writeStream);
// 设置代理
_inputStream.delegate = self;
_outputStream.delegate = self;
// 把输入输出流添加到主运行循环
// 不添加主运行循环 代理有可能不工作
[_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[_outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
// 打开输入输出流
[_inputStream open];
[_outputStream open];
}
// NSStreamDelegate 代理方法
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
switch (eventCode) {
case NSStreamEventOpenCompleted:
NSLog(@"输入输出流打开完成");
break;
case NSStreamEventHasBytesAvailable:
NSLog(@"有字节可读");
[self readData];
break;
case NSStreamEventHasSpaceAvailable:
NSLog(@"可以发送字节");
break;
case NSStreamEventErrorOccurred:
NSLog(@" 连接出现错误");
break;
case NSStreamEventEndEncountered:
NSLog(@"连接结束");
// 关闭输入输出流
[_inputStream close];
[_outputStream close];
// 从主运行循环移除
[_inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[_outputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
break;
default:
break;
}
}
- (void)readData{
// 建立一个缓冲区
uint8_t buf[1024];
NSInteger len = [_inputStream read:buf maxLength:sizeof(buf)];
NSData *data = [NSData dataWithBytes:buf length:len];
// 从服务器接收到的数据
NSString *recStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",recStr);
[self sendMsg:@"好的 我知道了"];
}
- (void)sendMsg: (NSString *)msg
{
NSData *data = [msg dataUsingEncoding:NSUTF8StringEncoding];
[_outputStream write:data.bytes maxLength:data.length];
}
- (void)dealloc
{
[self sendMsg:@"quit"];
}
好多年前 刚学iOS的时候 读过这段代码, 那时候不懂, 一股脑的死记硬背, 现在看 看着吧 好像还能讲讲故事








网友评论