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中要加上什麼呢?
圖三:針對問題(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: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:
如果看書,找"影片播放"(iPhone App程式設計6-6節、6-73頁)、Media Player Framework(Oreilly、iPhone SDK 14章、p349)。
用MPMoviePlayerController往往用到NSURL Class,兩者均可在Xcode內找到,方法:
上股溝找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不熟,正在問一下別人。