当前位置:  编程技术>综合
本页文章导读:
    ▪从Samples中入门IOS开发(四)------ 基于socket的网络编程      SimpleNetworkStreams展示了如何基于Socket网络编程,实现了一个很典型的局域网内网络数据传输的场景,一个是client向server端发送本地的图片文件,另一个是client向server端下载图片到本地文件。抽.........
    ▪工作趣事 之 重装服务器后的网站不能正常访问的问题       工作三个月了 学到的东西确实很多 每天学的不亦乐乎啊。。。 其实刚来公司的时候就碰到的许多棘手的问题   最大的一个问题就是公司的服务器由于长期没有人维护 导致服务器上的.........
    ▪java序列化学习笔记      待序列化的类 实现Serializable接口 package test.java; import java.io.Serializable; public class User implements Serializable{ private int id; public int getId() { return id; } public void setId(int id) { this.id = id; } public Strin.........

[1]从Samples中入门IOS开发(四)------ 基于socket的网络编程
    来源: 互联网  发布时间: 2014-02-18

SimpleNetworkStreams展示了如何基于Socket网络编程,实现了一个很典型的局域网内网络数据传输的场景,一个是client向server端发送本地的图片文件,另一个是client向server端下载图片到本地文件。抽取出来的一般流程:

  • server开启socket监听

此处IOS的一般做法是三步走:

第一步:创建系统级的socket,并绑定端口

    port = 0;
    
    fd = socket(AF_INET, SOCK_STREAM, 0);
    success = (fd != -1);
    
    if (success) {
        memset(&addr, 0, sizeof(addr));
        addr.sin_len    = sizeof(addr);
        addr.sin_family = AF_INET;
        addr.sin_port   = 0;
        addr.sin_addr.s_addr = INADDR_ANY;
        err = bind(fd, (const struct sockaddr *) &addr, sizeof(addr));
        success = (err == 0);
    }
    if (success) {
        err = listen(fd, 5);
        success = (err == 0);
    }
    if (success) {
        socklen_t   addrLen;

        addrLen = sizeof(addr);
        err = getsockname(fd, (struct sockaddr *) &addr, &addrLen);
        success = (err == 0);
        
        if (success) {
            assert(addrLen == sizeof(addr));
            port = ntohs(addr.sin_port);
        }
    }

这里用port=0是让系统自动随机找一个空闲端口。其他都是基于c风格对系统函数的直接调用。

第二步:用IOS的socket(CFSocket)包装系统socket

CFSocketContext context = { 0, (__bridge void *) self, NULL, NULL, NULL };

assert(self->_listeningSocket == NULL);
self->_listeningSocket = CFSocketCreateWithNative(
    NULL, 
    fd, 
    kCFSocketAcceptCallBack, 
    AcceptCallback, 
    &context
);
success = (self->_listeningSocket != NULL);

if (success) {
    CFRunLoopSourceRef  rls;
    
    fd = -1;        // listeningSocket is now responsible for closing fd

    rls = CFSocketCreateRunLoopSource(NULL, self.listeningSocket, 0);
    assert(rls != NULL);
    
    CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode);
    
    CFRelease(rls);
}

这里包装socket的目的是便于后面的事件侦听和处理,把基于原生态socket的开发转到IOS的层面上来,这里accept事件侦听函数是AcceptCallback,并在单独thread中执行。

第三步:通过NSNetService发布socket

if (success) {
    self.netService = [[NSNetService alloc] initWithDomain:@"local." type:@"_x-SNSUpload._tcp." name:@"Test" port:port];
    success = (self.netService != nil);
}
if (success) {
    self.netService.delegate = self;
    
    [self.netService publishWithOptions:NSNetServiceNoAutoRename];
    
    // continues in -netServiceDidPublish: or -netService:didNotPublish: ...
}

这里是基于NSNetService把先前创建的socket发布出去,便于clienti连接和请求。

  • client发起socket连接请求

这里是client通过前面server发布出来了netservice,发起对socket的连接:

netService = [[NSNetService alloc] initWithDomain:@"local." type:@"_x-SNSUpload._tcp." name:@"Test"];

  • server监听并处理数据请求

server会在accept的事件侦听的回调函数里对socket打开stream,并侦听stream上的各种IO事件:

CFStreamCreatePairWithSocket(NULL, fd, &readStream, NULL);
assert(readStream != NULL);

self.networkStream = (__bridge NSInputStream *) readStream;

CFRelease(readStream);

[self.networkStream setProperty:(id)kCFBooleanTrue forKey:(NSString *)kCFStreamPropertyShouldCloseNativeSocket];

self.networkStream.delegate = self;
[self.networkStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

[self.networkStream open];

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
    // An NSStream delegate callback that's called when events happen on our 
    // network stream.
{
    assert(aStream == self.networkStream);
    #pragma unused(aStream)

    switch (eventCode) {
        case NSStreamEventOpenCompleted: {
            [self updateStatus:@"Opened connection"];
        } break;
        case NSStreamEventHasBytesAvailable: {
            NSInteger       bytesRead;
            uint8_t         buffer[32768];

            [self updateStatus:@"Receiving"];

            // Pull some data off the network.
            
            bytesRead = [self.networkStream read:buffer maxLength:sizeof(buffer)];
            if (bytesRead == -1) {
                [self stopReceiveWithStatus:@"Network read error"];
            } else if (bytesRead == 0) {
                [self stopReceiveWithStatus:nil];
            } else {
                NSInteger   bytesWritten;
                NSInteger   bytesWrittenSoFar;

                // Write to the file.
                
                bytesWrittenSoFar = 0;
                do {
                    bytesWritten = [self.fileStream write:&buffer[bytesWrittenSoFar] maxLength:bytesRead - bytesWrittenSoFar];
                    assert(bytesWritten != 0);
                    if (bytesWritten == -1) {
                        [self stopReceiveWithStatus:@"File write error"];
                        break;
                    } else {
                        bytesWrittenSoFar += bytesWritten;
                    }
                } while (bytesWrittenSoFar != bytesRead);
            }
        } break;
        case NSStreamEventHasSpaceAvailable: {
            assert(NO);     // should never happen for the output stream
        } break;
        case NSStreamEventErrorOccurred: {
            [self stopReceiveWithStatus:@"Stream open error"];
        } break;
        case NSStreamEventEndEncountered: {
            // ignore
        } break;
        default: {
            assert(NO);
        } break;
    }
}

以上代码是server监听到有数据发过来时,把数据写入本地文件中,这里实际上就是把网络inputstream写入File的outputstream。这里handleevent方法是当设置了self.networkStream.delegate = self后IO事件的回调函数,handleevent里就需要根据不同的事件类型进行不同的处理。

  • client发送和接受数据流

client的数据处理与server类似也是通过对网络stream的事件监听来完成:

self.networkStream = output;
self.networkStream.delegate = self;
[self.networkStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

[self.networkStream open];

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
    // An NSStream delegate callback that's called when events happen on our 
    // network stream.
{
    assert(aStream == self.networkStream);
    #pragma unused(aStream)

    switch (eventCode) {
        case NSStreamEventOpenCompleted: {
            [self updateStatus:@"Opened connection"];
        } break;
        case NSStreamEventHasBytesAvailable: {
            assert(NO);     // should never happen for the output stream
        } break;
        case NSStreamEventHasSpaceAvailable: {
            [self updateStatus:@"Sending"];
            
            // If we don't have any data buffered, go read the next chunk of data.
            
            if (self.bufferOffset == self.bufferLimit) {
                NSInteger   bytesRead;
                
                bytesRead = [self.fileStream read:self.buffer maxLength:kSendBufferSize];
                
                if (bytesRead == -1) {
                    [self stopSendWithStatus:@"File read error"];
                } else if (bytesRead == 0) {
                    [self stopSendWithStatus:nil];
                } else {
                    self.bufferOffset = 0;
                    self.bufferLimit  = bytesRead;
                }
            }
            
            // If we're not out of data completely, send the next chunk.
            
            if (self.bufferOffset != self.bufferLimit) {
                NSInteger   bytesWritten;

                bytesWritten = [self.networkStream write:&self.buffer[self.bufferOffset] maxLength:self.bufferLimit - self.bufferOffset];
                assert(bytesWritten != 0);
                if (bytesWritten == -1) {
                    [self stopSendWithStatus:@"Network write error"];
                } else {
                    self.bufferOffset += bytesWritten;
                }
            }
        } break;
        case NSStreamEventErrorOccurred: {
            [self stopSendWithStatus:@"Stream open error"];
        } break;
        case NSStreamEventEndEncountered: {
            // ignore
        } break;
        default: {
            assert(NO);
        } break;
    }
}
这里的过程与server端正好相反,是从file的Inputstream中读入数据,并写入网络的outputsteam中。

以上就是我理解的IOS中Socket网络编程的一般模式。

作者:cutesource 发表于2013-1-14 10:34:11 原文链接
阅读:61 评论:0 查看评论

    
[2]工作趣事 之 重装服务器后的网站不能正常访问的问题
    来源: 互联网  发布时间: 2014-02-18

工作三个月了 学到的东西确实很多 每天学的不亦乐乎啊。。。


其实刚来公司的时候就碰到的许多棘手的问题  


最大的一个问题就是公司的服务器由于长期没有人维护 导致服务器上的文件比较混乱 且服务器上的数据库丢失了某些文件 到后来 数据库打也打不开了 这很让我头疼


公司最近要新上线一个网站 想放在公司的服务器上 于是重新搭建服务器的担子 就落在了我头上


说干就干 办好了手续 开好了证明 去到恐怖的机房 将公司的服务器拿了回来 


以前在学校的时候我根本没有接触过服务器 只是实习的时候见别人装过 这次没办法了 死马当活马医了


巴拉巴拉。。。。。。 鼓捣了三四天 可算是弄好了 (以上纯属扯淡 下面开始说正题)


由于服务器系统是新装的 之前客户的网站全都没有了 全部要重新搭建


我将备份的程序和数据库拷贝到了服务器上 配置好IIS 错误出现了 
// 错误截图


网上查后 原来是因为 项目没有ajax运行库支撑,出现错误 (什么是ajax?请看我的博文 浅谈Ajax)


找到了解决方案 就开始解决 


1. 先下载一个asp.net ajax 


2. 在 C:\Program Files\Microsoft ASP.NET\ASP.NET 2.0 AJAX Extensions\v1.0.61025 目录下 有两个dll文件
// dll截图


3. 将这两个dll拷贝到网站程序的dll目录下


由于之前服务器上的数据库版本是 SQL Server2005   现在服务器上数据库版本是SQL Server2008  所以 config文件也要修改一下


修改之后 就和原来的一样了 


作者:popping_dancer 发表于2013-1-14 10:30:06 原文链接
阅读:49 评论:0 查看评论

    
[3]java序列化学习笔记
    来源: 互联网  发布时间: 2014-02-18

待序列化的类 实现Serializable接口

package test.java;
import java.io.Serializable;
public class User implements Serializable{
	private int id;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	private String name;
	private int age;

}

测试类

package test.java;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;

public class MySerialization {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String filePath="d:\\user.txt";
		User user=new User();
		user.setId(1);
		user.setName("zhangsan");
		user.setAge(22);
		writeUser(user, filePath);
		User user1=readUser(filePath);
		System.out.println(user1.getId());
		System.out.println(user1.getName());
		System.out.println(user1.getAge());
		
		

	}
	
	public static void writeUser(Object object,String filePath){
		ObjectOutputStream objectOutputStream=null;
		try {
			
			objectOutputStream=new ObjectOutputStream(new FileOutputStream(new File(filePath)));
			objectOutputStream.writeObject(object);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
				try {
					objectOutputStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}
	
	public static User readUser(String filePath){
		ObjectInputStream objectInputStream=null;
		User user=null;
		try {
			objectInputStream=new ObjectInputStream(new FileInputStream(new File(filePath)));
			user=(User)objectInputStream.readObject();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}finally{
			try {
				objectInputStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return user;
		
	}

}

输出结果

1
zhangsan
22


作者:wodwl 发表于2013-1-14 10:28:29 原文链接
阅读:53 评论:0 查看评论

    
最新技术文章:
▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类
▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源
▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
▪sharepoint 2010 自定义列表启用版本记录控制 如...    ▪解决UIScrollView截获touch事件的一个极其简单有...    ▪Chain of Responsibility -- 责任链模式
▪运行skyeye缺少libbfd-2.18.50.0.2.20071001.so问题    ▪sharepoint 2010 使用sharepoint脚本STSNavigate方法实...    ▪让javascript显原型!
▪kohana基本安装配置    ▪MVVM开发模式实例解析    ▪sharepoint 2010 设置pdf文件在浏览器中访问
▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
▪优化后的冒泡排序算法    ▪elasticsearch RESTful搜索引擎-(java jest 使用[入门])...    ▪MyEclipse下安装SVN插件SubEclipse的方法
▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
▪Deep Copy VS Shallow Copy    ▪iphone游戏开发之cocos2d (七) 自定义精灵类,实...    ▪100个windows平台C++开发错误之八编程
▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
▪【D3D11游戏编程】学习笔记十八:模板缓冲区...    ▪codeforces 70D 动态凸包    ▪c++编程风格----读书笔记(2)
▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
▪markdown    ▪[设计模式]总结    ▪网站用户行为分析在用户市场领域的应用
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3