iPhone創意開發入門與實戰第16章16.2.4套接字TCP聊天程序

iPhone創意開發入門與實戰第16章16.2.4套接字TCP聊天程序:2010年08月31日星期二

iPhone創意開發入門與實戰是本簡體字iPhone程式開發用書,第16章是網絡開發,16.2.4套接字TCP聊天程序是練習 server / client 兩方面可以互相發送訊息。

先到人民郵電出版社網站 http://www.ptpress.com.cn下載source code。 進入 http://www.ptpress.com.cn 後,點上方的<資源下載> ,再至最下方鍵入iPhone搜尋,就可找到iPhone創意開發入門與實戰的source code。 下載後,有個"整理后"資料夾,打開Xcode(),點File/Open/整理后/ch16/ch16.2.4/SocketDemo,會出現兩個資料夾,一為TCPServer、一為TCPClientdemo。

先點TCPServer/TCPServer.xcodeproj,打開了server程式,點左上角Overview,並確定選擇Mac OS X 10.6 (Base SDK) / Release / TCPServer / i386。然後點Build / Build and Run,等到右下角出現Succeeded後,點Run/Console,這時如圖一的server會出現。

其次點TCPClientdemo/TCPClientdemo.xcodeproj,打開了client程式,點左上角Overview,並確定選擇iPhone Simulator 3.1。然後點Build / Build and Run,等到右下角出現Succeeded後,這時會出現iPhone simulator畫面,正中央會有"服務器IP"及其下的空格,在空格內鍵入127.0.0.1,再點其下的<連接>,這時會出現如圖二的Client 畫面。

圖二的Client 畫面空格中打入www,再點發送,此時,Me:www會出現在圖二的Client 的第一行,received:www會出現在圖一的server的第一行。

接著在圖一的server的第二行鍵入xxx,按下Enter鍵後,此時Server:xxx會出現在圖二的Client 畫面第二行。

接著在圖一的server的第三行鍵入yyy,按下Enter鍵後,此時Server:yyy會出現在圖二的Client 畫面第三行。

圖二的Client 畫面空格中打入rrrrrr,再點發送,此時,Me:rrrrrr會出現在圖二的Client 的第一行,received:rrrrrr會出現在圖一的server的第一行。

如此來來回回即可server / client 兩方面互相發送訊息。

以上是用simulator,我又將TCPClientdemo/TCPClientdemo.xcodeproj放到iPhone上,並在Mac上,點系統偏好設定/網路,找到"Airport"已連接至"552176"(此為我的無線網路),且其IP位址為192.xyz.a.b,此時我到iPhone,打入192.xyz.a.b,就連上Mac 如圖一的server。並且可以兩方面互相發送訊息,如同用simulator一般。

問題解答:

(1)bg75522在2010/Sep/04 18:17問: 如果我想要Client端送1給SERVER, SERVER自動回傳給他, 在SERVER中要加上什麼呢?

答:說明見圖三圖四

 

 

圖一:Server

 

圖二:Client

圖三:針對問題(1),需加入的程式:如下圖中65~71行。這一段程式碼是由圖一的server相對應程式碼中第43~47行修改而來(見圖四)。以下為下圖65~71行簡單說明。

66行:測試outputStream,當Client端將Server的IP鍵入,outputStream就不是NULL了。

67行:CFWriteStreamWrite將buff內的string寫入outputStream內strlen((char *)buff) +1)個character。

 

圖四:圖三的65~71行是由下圖中圖一的server相對應程式碼第43~47行修改而來。

 

 

回應

Client 要接收server 丟出來的 Stream 及影像

老師, 我是Anny, 我已經把client跟server連上了, 但是我要接收server丟回來的影像, 請問老師可以給一些方向嗎?

iphone 只能播放副檔名為.mp4 及 .mov 的檔案嗎?

 老師, 我想要播放副檔名為.h264的檔案, iphone可以支援嗎? 
Best regards,
Anny
 

依document,似乎只有.mov, .mp4,

依document,似乎只有.mov, .mp4, .mpv, and .3gp,如下:

 

Supported Formats

This class plays any movie or audio file supported in iOS. This includes both streamed content and fixed-length files. For movie files, this typically means files with the extensions .mov, .mp4, .mpv, and .3gp and using one of the following compression standards:

  • H.264 Baseline Profile Level 3.0 video, up to 640 x 480 at 30 fps. (The Baseline profile does not support B frames.)
  • MPEG-4 Part 2 video (Simple Profile)

If you use this class to play audio files, it displays a white screen with a QuickTime logo while the audio plays. For audio files, this class supports AAC-LC audio at up to 48 kHz, and MP3 (MPEG-1 Audio Layer 3) up to 48 kHz, stereo audio.

我記得你說過,似乎用IE可play你的file,online有嗎?給我網址,我用IE試試。若可連,我再寫個iPhone小程式試試。

IE網址

老師, 我的IE網址是220.130.136.220
帳號是root
密碼是 111111
您可以連連看, 我在IE可以連, 但是實在不知如何用iPhone來看, 試了好久!
Anny

看不到video

進去了,看不到video,我是IE7。
不給我裝activeX,因window無法認證發行者。
 
Jesse

activeX

老師
因為簽章過期, 目前已經在申請中, 您可以先用32位元的IE, 並降低安全層級, 應該就可以看到影像, 請再幫我試一下喔!
還有, 老實如果還要開課, 一定要通知我喔! 謝謝~
Anny

ie是第幾鈑約

用了chrom、mozilla都沒法子,設定完全不防這網站都不行。你ie是第幾版的?問一下工程師,請他寫個明確步驟(如同我課程講義,1234..),免得我東試西試。

沒回應

老師  不理我了?

忙中

忙中,今天去排ipad2,且你的問題似乎非一般性可能需進去看file才行,可惜我非file專門

iPhone創意開發入門與實戰第332頁

iPhone創意開發入門與實戰第332頁有個readStream,看來是接收的,其中有一行
[self performSelectorOn MainThread:@selector(setTextInMainThread:) withObject:s waitUntilDone:YES];
我猜是將setTextInMainThread:換成你們自已收server影像的程式。
jesse

H.264影像測試

老師, 我想先測試一下我們機器所錄的影像是否能在iPhone播放, 我先用我的機器錄了一段影像, 但是我不知道要如何測試這個影像是否能在iPhone播放ㄟ!

影像播放

MPMoviePlayerController可能適用。依其document:

  • H.264 Baseline Profile Level 3.0 video, up to 640 x 480 at 30 fps. (The Baseline profile does not support B frames.)

如果看書,找"影片播放"(iPhone App程式設計6-6節、6-73頁)、Media Player Framework(Oreilly、iPhone SDK 14章、p349)。
用MPMoviePlayerController往往用到NSURL Class,兩者均可在Xcode內找到,方法:

  • 寫下MPMoviePlayerController或NSURL,選它,Help/Find Documentation for Selected Text,就會出現該class的documentation。

上股溝找MPMoviePlayerController或NSURL也行,用Xcode較快。
 
jesse

我下了 解压不了~~

我下了 解压不了~~

 您好我照著上面的程試打進去可是就變成了 client端輸

 您好我照著上面的程試打進去可是就變成了
client端輸入甚麼SERVER端救回甚麼噎
是還有要在改甚麼媽?

請看圖三,67行。 CFWriteStreamWrite(

請看圖三,67行。

CFWriteStreamWrite(outputStream,buff,strlen((char *)buff) +1);

要傳給Client的字串就存在buff內,現在會"client端輸入甚麼,SERVER端就回甚麼",那是因為65行自Client端讀了buff。

假設要回傳字串a,試著在67行之上加入下兩行:

buff[0] = 'a';

buff[1] = '\n';

 

By Jesse1

 

有點看不太懂 現在我加入了那兩行變成Client端不管輸入

有點看不太懂
現在我加入了那兩行變成Client端不管輸入什麼
SERVER都回傳a給我
我想要輸入1回傳a
輸入2回傳B這樣我要怎麼改呢

假設要1回傳字串a,2回傳B

假設要1回傳字串a,2回傳B,試著在67行之上加入下三行:
if ( buff[0] == '1' ) buff[0] = 'a' ;
if ( buff[0] == '2' ) buff[0] = 'B' ;
buff[1] = '\n';
若要改成其他方式,可找一本C語言的程式書翻翻,大約看完前三章,你所有的這些問題都可迎刃而解。
 
Jesse

成功了謝謝!!

成功了謝謝!!

另外想到一個問題

如果我想要Client端送1給SERVER
SERVER自動回傳2給他
在SERVER中要加上什麼呢?

見原文問題解答(1)。 by

見原文問題解答(1)

by jesse1(阿羯分身--工程師)

我用JAVA傳訊息給SERVER然後SERVER回傳數值是

我用JAVA傳訊息給SERVER然後SERVER回傳數值是可以的
旦是轉乘用IPONE傳訊息到SERVER
SERVER顯示有接收到並且回傳訊息
但是IPHONE的client端就沒有顯示收到的訊息耶

我寫程式的那台電腦是10.5好像就沒辦法執行SEVER端的

我寫程式的那台電腦是XP灌MAC的版本是10.5好像就沒辦法執行SEVER端的程式了

我用Mac Mini 10.6.4

我用的是Mac Mini 10.6.4。

我SEVER是用JAVA寫的架在另一台電腦上 但是回傳過去

我SEVER是用JAVA寫的架在另一台電腦上
但是回傳過去的訊息都不會顯示在手機上面耶~

說不定可用apache server試試?

似乎有個什麼telnet之類的。若能在PC上先run apache server再run telnet,看看可否和iPhone互相傳?
apache我不會,剛拿apache書來看了一下,好像有telnet這東西。

用iPhone實機和Mac交流,通過無線網路

以上是用simulator,我又將TCPClientdemo/TCPClientdemo.xcodeproj放到iPhone上,並在Mac上,點系統偏好設定/網路,找到"Airport"已連接至"552176"(此為我的無線網路),且其IP位址為192.xyz.a.b,此時我到iPhone,打入192.xyz.a.b,就連上Mac 如圖一的server。並且可以兩方面互相發送訊息,如同用simulator一般。

我陷再可以連到我另一台電腦的SETVER(SERVER是J

我陷再可以連到我另一台電腦的SETVER(SERVER是JAVA寫的)
還可以傳訊息過去但回傳的訊息不會顯示在上面耶
是出了什麼問題嗎?

Server上 Connection的getInputStream()需要更改

Client和 Server之間用socket互傳東西時,如果不是像站主提供的例子直接回傳字元,卻看不見時
Server一定有某種判斷接到Stream的方法,在這個例子必需要去了解server是如何處理接到的stream的
並不是每一個socket client傳的東西,server都會回傳值。這個也可以稱做兩者(client和server)之間的protocol
但至少server會傳回一些連結成功的訊息,如果連結成功的訊息沒有傳到,可能就是並沒有找到server,要檢查server有沒有連線,或是client寫錯server位置
之後要和server正確溝通的話,也要了解server是怎麼處理接到的stream的。
 
 
By Scentsome

我SERVER有顯示收到訊息並且回傳訊息 但是client

我SERVER有顯示收到訊息並且回傳訊息
但是client那邊就沒有顯示收到的訊息

Client連別的Server有成功過嗎?

用站長所提的例子,iPhone上的Client和一個自己架的Server (Objective-C 寫的) 有成功過嗎?
不然你的server IP 是公開的嗎?或者可以先打開讓我來試連看看
 
 
 
 
 
By Scentsome

連到自己SERVER是成功的 我的JAVA

連到自己SERVER是成功的
我的JAVA SERVER有顯示然後我用iPhone上的Client輸入文字
JAVA SERVER都有顯示出來並且回傳訊息
但是iPhone上的Client就沒有顯示SERVER傳回來的文字

正在問一下別人

對server不熟,正在問一下別人。