Tag: 套接字

什么是iOS的等同于Android的Socket编程代码?

我在Android(Java)中有一些套接字编程代码,我想在iOS(Objective-C)中实现相同的function。 在iOS上, NSStream , NSInputStream , NSOutputStream是套接字编程的一些类。 在将它们与Android的SocketChannel类中的某些方法进行比较时,我有些怀疑。 socketChannel.configureBlocking socketChannel.setSoTimeout socketChannel.connect socketChannel.finishConnect socketChannel.isConnected NSStream , NSInputStream等iOS类中的等效方法是什么? Android上的ByteBuffer也有一个position()方法。 什么是在iOS中的等效方法? 我知道NSStream常量在那里,但是我们对如何映射到Android代码感到困惑。 你能否build议哪些方法在iOS中是相同的?

使用iPhone作为热点时,TCP连接无法正常工作

我正在开发一个iOS应用程序,通过TCP套接字连接到Android上运行的服务器应用程序。 为了find第二个设备的IP,我使用UDP请求并接收服务器的IP。 当我将它们连接到Wi-Finetworking或将Android设备用作iPhone的热点时,它一直运行良好。 但是,如果我想让iOS设备成为个人热点,那么我无法在两个设备之间build立联系,而且这个应用程序在这个系统中是无用的。 那么是否有可能连接设备,是algorithm的问题? 我很高兴听到有人遇到类似的问题,并且知道解决scheme。

使用套接字恢复丢失的连接

我试图通过使用iPhone图表服务器的这个例子深入挖掘,并且所有工作都按预期工作。 我接下来要学的是如何在应用程序运行时丢失连接到服务器的连接(无论出于何种原因)。 首先问题是,应用程序试图同时打开input和输出stream,因此如果我实现了一个警报,我得到了两次。 我设法通过closuresstream来解决这个问题。 第二个是,如果我是另一个视图控制器,连接丢失,我似乎无法恢复它。我打电话给sendSocketMessage,如果有错误平面尝试使用initNetworkCommunication,但我得到一个致命的错误。 这第二个问题让我烦恼。 我已经添加了一个所有exception断点,但什么都没有。 我如何尝试“testing”这是通过确保服务器的工作和应用程序加载和连接。 然后我closures服务器,尝试几下点击应用程序,我得到警报。 我打开服务器,并尝试再次点击,我得到的消息发送到服务器,但然后应用程序崩溃,没有任何信息! @implementation ViewController bool connectionError = true; – (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } – (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } – (void)initNetworkCommunication { CFReadStreamRef readStream; […]

Swift中socket.io的意外古怪行为

按照标题,我在处理socket.io时遇到了一些麻烦。 它连接得非常好,因此在第一个视图控制器中,但是当涉及到第二个控制器时会发生奇怪的事情。 代码如下: 第一个控制器:我已经声明了两个视图控制器之间的连接目的的全局variables。 import UIKit import SocketIOClientSwift import SwiftyJSON import CoreData //declare some global variable var patientCoreData = [NSManagedObject]() var numberOfUsersExisting:Int = 0 //assign to 0 by default var appUserData: Patient? //for specific user var pSample: Array<Patient> = [] //for all user //initiate socket globally let socket = SocketIOClient(socketURL: "localhost:3000", options: [ "reconnects": true […]

如果Wi-Fi也在IOS中连接,如何通过蜂窝networking发送数据

我正在一个ios应用程序,我需要始终通过蜂窝networking发送数据,无论设备是否连接到Wi-Fi或没有连接。如果Wi-Fi没有连接,那么一切正常,但是当Wi-Fi连接,然后数据通过Wi-Fi通道,我认为它是连接状态下数据传输的默认通道。当Wi-Fi连接和活动时,如何强制数据通过蜂窝networking发送。 我不想提示用户禁用Wi-Fi。

AsyncSocket:合并两个数据包而不是分开的两个数据包

我正在执行4个启动命令,也期待收到4个响应。 服务器已经实现,另一个正在开发android的开发者能够接收这4个单独的响应,但是,我得到了2个很好的响应(单独的),然后第三个和第四个响应作为一个响应。 我把NSData的NSLog结果放在completeCurrentRead中,输出合并的数据包“0106000000000b0600000000”而不是单独的数据包“010600000000”和“0b0600000000”。 我还分别testing了这些第三和第四个命令(一次只能有一个),一切正常,然后分别发送,但是如果所有四个命令在一行中执行,就会发生合并(第三和第四) 。 有任何想法吗? 更新:我想我已经追溯到问题的根源。 有一个调用从doBytesAvailable方法的stream中读取数据包数据: CFIndex result = [self readIntoBuffer:subBuffer maxLength:bytesToRead]; 在readIntoBuffer:maxLength中,有一个调用(长度= 256): return CFReadStreamRead(theReadStream, (UInt8 *)buffer, length); 因此,CFReadStreamRead返回不正确的数据包长度 – 它返回12(而不是6)的长度,也抓取合并的数据。 嗯,什么可能会导致CFReadStreamRead阅读两个数据包成一个,而不是分开阅读它们… UPDATE2:我正在使用onSocket:didReadData:withTag:委托方法,并希望接收响应数据与我执行的请求的标记。 我最近意识到,stream是stream,而不是数据包,但是我怎么能解决这个问题呢? 服务器响应在响应的开始和结束处没有终止字符,只是响应大小,即2到5个字节。 我可以减less响应的第一部分(第一个数据包),忽略第二部分,但AsyncSocket如何使用响应的第二部分(第二个数据包)进行另一个callback? 如果我只会削减第一部分,忽略第二,然后恕我直言,第二个“包”将丢失… 如何减less响应的第一部分,并告诉AsyncSocket使用标记和响应的第二部分作为单独的callback进行另一个callback? UPDATE3:在onSocket:didReadData:withTag :,我手动剪切合并的响应,处理第一部分(第一个数据包),然后在最后,对onSocket:didReadData:withTag:再次调用: if (isMergedPacket) { … [self onSocket:sock didReadData:restPartOfTheResponse withTag:myCommandTag]; } 然而,它看起来像AsyncSocket本身使用标签将每个请求包与其响应包(通过AsyncReadPacket类)配对。 所以,我的手动切割工作,但AsyncSocket不知道我已经处理了两个数据包,它仍然试图读取第二个数据包。 所以,我得到的袜子:shouldTimeoutReadWithTag:…callback,当一个读取操作达到超时没有完成时调用。

通过GCDAsyncUdpSocket发送多播UDP失败,Wireshark中没有任何活动

它适用于任何已知的IP,如下所示: [udpSocket sendData:datatosend toHost:@"192.168.1.113" port:port withTimeout:-1 tag:0]; 但是,当我试图使用宽带多播,没有logging,什么都没有发生 [udpSocket sendData:datatosend toHost:@"192.168.1.255" port:port withTimeout:-1 tag:0]; 接收作品好吧,我也试过255.255.255.255 – 相同。 它不会给出任何错误。

无法在CFWriteStreamWrite上写入

我在向CFStream写入数据时遇到了麻烦。 // i am getting the CFSocketRef and then from it getting native Handle. CFSocketNativeHandle sock = CFSocketGetNative( [appDelegate getSocketRef]); 上面的代码是否返回了与创build的套接字相同的处理程序?我写入stream中的内容将写入创build的套接字中? // and then wrote CFStreamCreatePairWithSocket(kCFAllocatorDefault, sock, &readStream, &writeStream); if (!readStream || !writeStream) { // close([appDelegate TCPClient]); // close(sock); fprintf(stderr, "CFStreamCreatePairWithSocket() failed\n"); return; } 上面的工作正常,它不给我失败的消息 // does not give error ,else portion is executed if […]

使用套接字发出Http请求

我试图做一个GET / POST请求。 GET请求现在。 我能够build立连接,但我得到的回应是从来没有200 OK。 这是代码 int socketFD; struct sockaddr_in myaddr; // struct sockaddr_in hints; socketFD = socket(AF_INET, SOCK_STREAM, 0); if (socketFD == -1) { NSLog(@"Error in making socket"); } myaddr.sin_port = htons(80); memset(&myaddr.sin_zero, '\0', 8); char *sendbug = "GET 173.194.66.99 HTTP/1.0\r\n\r\n"; struct sockaddr_in dest,their_addr; // struct addrinfo *res; struct sockaddr sockAddrToDisplay; dest.sin_family = […]

只有输出stream同时发送,iOSinputstream才能接收快速数据

我的iOS应用需要套接字通信。 我正在关注这个 Ray Wenderlich教程来设置input和输出stream。 我正在使用的服务器是Twisted。 我的应用程序需要发送和接收由陀螺仪数据等外部事件产生的快速爆发数据。 它是以JSONstring的forms发送/接收数据。 很大程度上,这就像一个实时消息聊天应用程序,但发送和接收速度非常快,爆发。 所以我的应用程序布局是,我有1视图控制器: DViewContorller和一个tabbarcontroller与3个tableviewcontrollers。 我需要在所有这4个视图控制器中发送和接收数据,因此我在App Delegate中实现了套接字stream初始化。 对于所有3个选项卡,我的App Delegate设置[self.inputstream setDelegate:self]但是当它在DViewController它将inputstream的委托设置为DViewController的引用。 在DViewController (void)viewWillDisappear中,我将inputstream委托重置为AppDelegate的引用,以使其重新获得对inputstream的控制权。 对于outputstream,委托始终设置为AppDelegate并且永远不会更改。 我的AppDelegate和DViewController都是<NSStreamDelegate> ,它们都实现了: – (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent} { } 所有的stream事件实施。 所以基本上,我的整个设置运行良好,但只有数据不是很快(或者说,我似乎无法查明确切的问题)。 所以这里有一些我在testing时所做的观察(使用Simulator-iPhone和iPhone-iPhone设置): A.模拟器 – iPHONE: 现在在这个设置中,我能够快速,准确地发送数据,从Simulator发送到iPhone,而不是从iPhone发送到Simulator。 iPhone收到所有的string,并按照要求行事。 从iPhone发送到模拟器,模拟器一次只能读取一个JSONstring的数据,并且在数据发送快时不起作用。 如果发送速度快,则模拟器接收到的所有string都是一半(仅接收到一半)。 注意:服务器接收和发送完整的string,即使速度很快,所有的string也没有问题。 如果我同时发送数据,同时从模拟器和iPhone发送数据,即使速度很快,也能很好地接收和处理所有的string。 B. iPHONE – iPHONE: 任何一个iPhone(任何一个发送,不能同时发送)一次只能接收一个JSONstring的数据,并且在数据快速发送时都不工作。 如果发送速度很快,那么任何iPhone收到的所有string都是一半(仅接收到一半)。 注意:服务器接收和发送完整的string,即使速度很快,所有的string也没有问题。 如果我同时发送数据,同时从两个iPhones到彼此,即使快速,都收到和处理好所有的string。 这些观察使我相信,只有当iPhone正在同时向服务器发送某些东西时,iPhone才能接收到所有快速string。 或者我可能是完全错误的,因为当模拟器发送到iPhone时,iPhone无论如何都能接收到一切。 我想知道模拟器做了什么不同,从iPhone收到的string是由iPhone完全采取,而不是相反。 iPhone的发送方式是否比模拟器的发送速度快,因此所有发送的string都不会被接收器注册? 有人帮我破解这个请! 注意:在任何情况下,服务器都能正常工作,无论速度如何,它都可以全速发送和接收数据。 我正在使用iOS 7。 更新1:好吧,一整天都在试验,我终于做到了。 […]