版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 課程設(shè)計(jì)題目: Android聊天室 </p><p> 學(xué) 院: 計(jì)算機(jī)學(xué)院 </p><p> 專業(yè)班級(jí): 網(wǎng)絡(luò)工程2班 </p>
2、<p> 年 級(jí): 2009級(jí) </p><p> 姓 名: x x x 學(xué) 號(hào): </p><p> 完成時(shí)間: 2012 年 7 月 5 日<
3、;/p><p> 成 績(jī): </p><p> 指導(dǎo)教師: 李季 </p><p><b> 摘要</b></p><p> 本次課程設(shè)計(jì)是以嵌入式系統(tǒng)課程和理論知識(shí)為基礎(chǔ),通過(guò)課程設(shè)計(jì)的實(shí)
4、踐,培養(yǎng)學(xué)生理論聯(lián)系實(shí)際的思想,加強(qiáng)學(xué)生對(duì)所修相關(guān)課程的理解、掌握,訓(xùn)練并提高學(xué)生Android應(yīng)用軟件的設(shè)計(jì)、編程能力,獨(dú)立解決問(wèn)題的思路。</p><p> 此系統(tǒng)設(shè)計(jì)了一個(gè)基于Android系統(tǒng)與PC之間的通信,采用Socket流式套接字進(jìn)行網(wǎng)絡(luò)通信。其中Android系統(tǒng)的模擬器作為客戶端,客戶端采用獲取手機(jī)號(hào)碼作為該客戶端的唯一標(biāo)識(shí),PC作為服務(wù)器端。依據(jù)Android應(yīng)用程序的仿真器,我們實(shí)現(xiàn)了多個(gè)
5、應(yīng)用客服端及服務(wù)器端的通信,其中,客服端之間可以相互進(jìn)行單獨(dú)的文本通信(私聊),也可以進(jìn)行群聊。同時(shí),客服端也可以進(jìn)行文件的傳輸。</p><p> 關(guān)鍵詞:Android;Socket通信;私聊;群聊;文件傳輸</p><p><b> 目錄</b></p><p> 一、聊天室的描述1</p><p> 1
6、.1聊天室的設(shè)計(jì)背景1</p><p> 1.2聊天室的基本功能1</p><p> 二、聊天室的設(shè)計(jì)2</p><p> 2.1聊天室的粗略設(shè)計(jì)分析2</p><p> 2.2聊天室的具體設(shè)計(jì)分析3</p><p> 三、聊天室的實(shí)現(xiàn)6</p><p> 3.1聊天室所
7、使用的類及功能的實(shí)現(xiàn)6</p><p><b> 四、運(yùn)行結(jié)果36</b></p><p> 五、課程設(shè)計(jì)存在問(wèn)題、解決方法及總結(jié)43</p><p> 5.1系統(tǒng)存在的問(wèn)題43</p><p> 5.2系統(tǒng)改進(jìn)方法43</p><p><b> 5.3總結(jié)44&l
8、t;/b></p><p> 六、 參考文獻(xiàn)44</p><p><b> 一、聊天室的描述</b></p><p> 1.1聊天室的設(shè)計(jì)背景</p><p> 當(dāng)今社會(huì),網(wǎng)絡(luò)技術(shù)越來(lái)越發(fā)展,可以說(shuō),二十一世紀(jì)就是網(wǎng)絡(luò)的世紀(jì)。網(wǎng)絡(luò)迅猛發(fā)展,勢(shì)不可擋。為了實(shí)現(xiàn)資源共享,各式各樣的網(wǎng)站發(fā)展迅速,各種各樣的聊天
9、工具不斷更新。所以制作一個(gè)聊天室勢(shì)在必行。</p><p> 為了實(shí)現(xiàn)一個(gè)更好的網(wǎng)絡(luò)交互平臺(tái),各用戶之間能夠?qū)崟r(shí)方便的傳遞信息,按照用戶對(duì)系統(tǒng)的要求不同,可以在聊天室里實(shí)現(xiàn)公共聊天,也可以邀幾個(gè)私交好友私聊,同時(shí)提供了兩個(gè)用戶之間能夠傳送文件。本系統(tǒng)是基于方便用戶聊天,傳遞信息,共享資源,所以系統(tǒng)的功能主要是從以上幾個(gè)模塊著手。</p><p> 本項(xiàng)目主要是利用Android制作一個(gè)
10、聊天室,采用的是客戶/服務(wù)器。 二層的C/S結(jié)構(gòu)是指以單一的服務(wù)器和局域網(wǎng)為核心,能通過(guò)客戶端與用戶進(jìn)行直接對(duì)話。主要有二大功能:一是它用于檢查用戶從鍵盤等輸入的數(shù)據(jù),顯示應(yīng)用輸出的數(shù)據(jù)。為使用戶能直觀地進(jìn)行操作,一般要使用圖形用戶接口,操作簡(jiǎn)單、易學(xué)易用。在變更用戶接口時(shí),只需改寫(xiě)顯示控制和數(shù)據(jù)檢查程序,而不影響其他。檢查的內(nèi)容也只限于數(shù)據(jù)的形式和值的范圍,不包括有關(guān)業(yè)務(wù)本身的處理邏輯。典型的C/S結(jié)構(gòu)有以下特點(diǎn):</p>
11、<p> 1、服務(wù)器負(fù)責(zé)數(shù)據(jù)管理及程序處理。</p><p> 2、客戶機(jī)負(fù)責(zé)界面描述和界面顯示。</p><p> 3、客戶機(jī)向服務(wù)器提出處理要求。</p><p> 4、服務(wù)器響應(yīng)將處理結(jié)果返回客戶機(jī)。</p><p> 5、使網(wǎng)絡(luò)數(shù)據(jù)流量最少。</p><p> 1.2聊天室的基本功能&
12、lt;/p><p><b> 用戶注冊(cè) </b></p><p><b> 用戶登錄</b></p><p><b> 用戶公聊</b></p><p><b> 用戶私聊</b></p><p><b> 傳輸文件
13、</b></p><p><b> 用戶注冊(cè)</b></p><p> 第一次用戶需要提供個(gè)人注冊(cè)信息,注冊(cè)的用戶名不能重復(fù),個(gè)人信息必須提供完整。</p><p><b> 用戶登錄</b></p><p> 用戶輸入用戶名和密碼,提交給將服務(wù)器端的確認(rèn),根據(jù)從服務(wù)器中傳過(guò)來(lái)的
14、確認(rèn)信息,判斷用戶登錄的情況。并且把此次登錄的時(shí)間及登錄的IP記錄在服務(wù)器。</p><p> 如果用戶名和密碼正確的話,則登錄聊天室主界面;如果已經(jīng)在線,則輸出已經(jīng)在線;否則輸出用戶名和密碼錯(cuò)誤,需要重新登錄或者注冊(cè)。</p><p><b> 用戶公聊</b></p><p> 用戶輸入的用戶名和密碼都正確后,則進(jìn)入聊天室。聊天主界面
15、主要由四大版塊組成:公聊的聊天信息、在線用戶列表、系統(tǒng)消息和聊天的一些操作。</p><p><b> 用戶私聊</b></p><p> 如果兩個(gè)人聊的話題比較隱秘,不想被其他人看到,就要使用私聊。在這里,如果說(shuō)話對(duì)象是所有人的話,不能選擇私聊;從當(dāng)前好友列表中選擇了一個(gè)用戶之后,則私聊對(duì)話框應(yīng)該彈出來(lái)。</p><p><b>
16、; 文件傳遞</b></p><p> 兩個(gè)用戶在聊天過(guò)程中,可能需要相互間傳送文件。象用戶聊天信息和在線用戶這樣一些信息都是保存在服務(wù)器端,然后每個(gè)客戶讀取服務(wù)器端向量中的內(nèi)容,此時(shí)服務(wù)器與客戶端的聯(lián)系是一對(duì)多的,而傳送文件是一對(duì)一的。所以直接傳送,不需要經(jīng)過(guò)服務(wù)器端保存。</p><p><b> 二、聊天室的設(shè)計(jì)</b></p>
17、<p> 2.1聊天室的粗略設(shè)計(jì)分析</p><p> 1、聊天系統(tǒng)平臺(tái)應(yīng)有兩個(gè)部分組成:服務(wù)端和客戶端。服務(wù)端主要完成用戶信息的存儲(chǔ)、客戶端命令的接受與響應(yīng)以及信息轉(zhuǎn)發(fā)等服務(wù)端應(yīng)有的功能??蛻舳酥饕瓿闪奶煨畔⒌陌l(fā)送與接受、登錄等功能。</p><p> 此系統(tǒng)使用的是TCP/IP協(xié)議,應(yīng)用了如下通訊模式:</p><p> 2、在網(wǎng)絡(luò)上的兩個(gè)
18、程序通過(guò)一個(gè)雙向的通信鏈路實(shí)現(xiàn)數(shù)據(jù)交換,這個(gè)雙向鏈路的一段就被稱為一個(gè)Socket,Socket通常用來(lái)實(shí)現(xiàn)客戶端和服務(wù)器端的鏈接。Socket是TCP/IP協(xié)議的一個(gè)十分流行的編程界面,一個(gè)Socket有一個(gè)IP地址和一個(gè)端口號(hào)確定。在Java環(huán)境中實(shí)現(xiàn)基于TCP/IP協(xié)議的網(wǎng)絡(luò)編程都需要采用Socket機(jī)制。并且與基于URL的網(wǎng)絡(luò)編程Socket編程提供更高的傳輸效率。</p><p> Socket通常采
19、用C/S結(jié)構(gòu),使用Socket進(jìn)行C/S程序設(shè)計(jì)的一般鏈接過(guò)程如下圖:</p><p> 圖1.1 Socket編程連接一般過(guò)程</p><p> 2.2聊天室的具體設(shè)計(jì)分析</p><p> 根據(jù)課程設(shè)計(jì)的要求及項(xiàng)目的需求分析,聊天程序應(yīng)實(shí)現(xiàn)以下幾項(xiàng)功能:登錄、注冊(cè)、公聊、私聊、文件傳送等。</p><p> 當(dāng)客戶程序需要與服務(wù)器
20、程序通訊的時(shí)候,客戶程序在客戶機(jī)創(chuàng)建一個(gè)socket對(duì)象。創(chuàng)建了一個(gè)Socket對(duì)象后,那么它可以通過(guò)調(diào)用Socket的getInputStream()方法從服務(wù)程序獲得輸入流讀傳送來(lái)的信息,也可以通過(guò)調(diào)用Socket的getOutputStream()方法獲得輸出流來(lái)發(fā)送消息。</p><p> 由于Client使用了流套接字,所以服務(wù)程序也要使用流套接字。這就要?jiǎng)?chuàng)建一個(gè)ServerSocket對(duì)象,接下來(lái)服
21、務(wù)程序進(jìn)入無(wú)限循環(huán)之中,無(wú)限循環(huán)從調(diào)用ServerSocket的accept()方法開(kāi)始,在調(diào)用開(kāi)始后accept()方法將導(dǎo)致調(diào)用線程阻塞直到連接建立。在建立連接后accept()返回一個(gè)最近創(chuàng)建的Socket對(duì)象,該Socket對(duì)象綁定了客戶程序的IP地址或端口號(hào)。由于存在單個(gè)服務(wù)程序與多個(gè)客戶程序通訊的可能,服務(wù)程序循環(huán)檢測(cè)是否有客戶連接到服務(wù)器上,如果有,則創(chuàng)建一個(gè)線程來(lái)服務(wù)這個(gè)客戶,以此完成對(duì)客戶端的監(jiān)聽(tīng)。</p>
22、<p> 在客戶端程序?qū)崿F(xiàn)了界面的顯示以及與服務(wù)器端的數(shù)據(jù)交互。各模塊主要功能及名稱如下:</p><p> 具體流程如下圖所示:</p><p><b> 未注冊(cè)用戶:</b></p><p><b> 主界面</b></p><p><b> 已注冊(cè)用戶:<
23、;/b></p><p><b> 三、聊天室的實(shí)現(xiàn)</b></p><p> 3.1聊天室所使用的類及功能的實(shí)現(xiàn)</p><p><b> 服務(wù)器啟動(dòng)類</b></p><p><b> 1、Server類</b></p><p> p
24、ublic class Server extends JFrame implements ActionListener{</p><p> BorderLayout borderLayout1=new BorderLayout();</p><p> BorderLayout borderLayout2= new BorderLayout();</p><p>
25、 JPanel jPanel1=new JPanel();</p><p> JPanel jPanel2=new JPanel();</p><p> JButton jButton1=new JButton();</p><p> JButton jButton2=new JButton();</p><p> JScrollP
26、ane jScrollPane1=new JScrollPane();</p><p> static JTextArea jTextArea1=new JTextArea();</p><p> boolean bool=false,start=false;</p><p> ServerThread serverThread;</p><
27、;p> Thread thread;</p><p> public Server()</p><p><b> {</b></p><p> super("Server");</p><p> getContentPane().setLayout(borderLayout1);<
28、;/p><p> jButton1.setText("啟動(dòng)服務(wù)器");</p><p> jButton2.setText("關(guān)閉服務(wù)器");</p><p> jButton1.addActionListener(this);</p><p> jButton2.addActionListener
29、(this);</p><p> getContentPane().add(jPanel1,BorderLayout.NORTH);</p><p> jPanel1.add(jButton1);</p><p> jPanel1.add(jButton2);</p><p> jTextArea1.setText("&qu
30、ot;);</p><p> jPanel2.setLayout(borderLayout2);</p><p> jPanel2.add(jScrollPane1, BorderLayout.CENTER);</p><p> jScrollPane1.getViewport().add(jTextArea1);</p><p>
31、getContentPane().add(jPanel2, BorderLayout.CENTER);</p><p> this.setSize(400, 400);</p><p> this.setVisible(true);</p><p><b> }</b></p><p> public stati
32、c void main(String[] args) {</p><p> Server server=new Server();</p><p> server.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);</p><p><b> }</b></p><p>&
33、lt;b> @Override</b></p><p> public void actionPerformed(ActionEvent e) {</p><p> if(e.getSource()==jButton1)</p><p><b> {</b></p><p> serverTh
34、read=new ServerThread();</p><p> serverThread.start();</p><p> }else if(e.getSource()==jButton2)</p><p><b> {</b></p><p> bool=false;</p><p&g
35、t; start=false;</p><p> serverThread.finalize();</p><p> this.setVisible(false);</p><p><b> }</b></p><p><b> }</b></p><p><
36、b> }</b></p><p> 2、ServerThread類</p><p> public class ServerThread extends Thread {</p><p> ServerSocket serverSocket;</p><p> public static final int POR
37、T=8524;</p><p> Vector<ClientThread> clients;</p><p> Vector<Object> messages;</p><p> BroadCast broadCast;</p><p> String ip;</p><p> Ine
38、tAddress myIPaddress=null;</p><p> public ServerThread()</p><p><b> {</b></p><p> clients=new Vector<ClientThread>();</p><p> messages=new Vector&
39、lt;Object>();</p><p><b> try {</b></p><p> serverSocket=new ServerSocket(PORT);</p><p> } catch (IOException e) {</p><p><b> }</b></p&
40、gt;<p><b> try {</b></p><p> myIPaddress=InetAddress.getLocalHost();</p><p> } catch (UnknownHostException e) {</p><p> System.out.println(e.toString());</
41、p><p><b> }</b></p><p> ip=myIPaddress.getHostAddress();</p><p> Server.jTextArea1.append("服務(wù)器地址: "+ip+"端口號(hào): "+</p><p> String.valueOf(
42、serverSocket.getLocalPort())+"\n");</p><p> broadCast=new BroadCast(this);</p><p> broadCast.start();</p><p><b> }</b></p><p> public void r
43、un()</p><p><b> {</b></p><p> while(true)</p><p><b> {</b></p><p><b> try {</b></p><p> Socket socket=serverSocket
44、.accept();</p><p> System.out.println(socket.getInetAddress().getHostAddress());</p><p> ClientThread clientThread=new ClientThread(socket,this);</p><p> clientThread.start();<
45、;/p><p> if(socket!=null)</p><p><b> {</b></p><p> synchronized (clients) {</p><p> clients.addElement(clientThread);</p><p><b> }</
46、b></p><p><b> }</b></p><p> } catch (IOException e) {</p><p> System.out.println("發(fā)生異常:"+e);</p><p> System.out.println("建立客戶端連接失敗!&qu
47、ot;);</p><p> System.exit(2);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> public void finalize()<
48、;/p><p><b> {</b></p><p><b> try {</b></p><p> serverSocket.close();</p><p> } catch (IOException e) {</p><p><b> }</b&g
49、t;</p><p> serverSocket=null;</p><p><b> }</b></p><p><b> }</b></p><p><b> 用戶登陸和注冊(cè)類</b></p><p> 1、MainActivity類<
50、;/p><p><b> /**</b></p><p> * 登陸的主要Activity,實(shí)現(xiàn)登陸的基本功能</p><p><b> * </b></p><p> * @author 鐘玉文</p><p><b> *</b></p&
51、gt;<p><b> */</b></p><p> public class MainActivity extends Activity {</p><p> /** Called when the activity is first created. */</p><p> private TextView tv1,
52、tv2;</p><p> private Button bt1,bt2;</p><p><b> @Override</b></p><p> public void onCreate(Bundle savedInstanceState) {</p><p> super.onCreate(savedInst
53、anceState);</p><p> setContentView(R.layout.main);</p><p> tv1=(TextView)this.findViewById(R.id._id);</p><p> tv1.setText("賬號(hào)");</p><p> tv2=(TextView)thi
54、s.findViewById(R.id._pwd);</p><p> tv2.setText("密碼");</p><p> bt1=(Button)this.findViewById(R.id.button_login);</p><p> bt2=(Button)this.findViewById(R.id.button_regist
55、e);</p><p> bt1.setOnClickListener(new OnClickListener(){</p><p><b> @Override</b></p><p> public void onClick(View v) {</p><p> // TODO Auto-generated
56、method stub</p><p> Intent intent=new Intent();</p><p> intent.setClass(MainActivity.this,MyFeiGeActivity.class);</p><p> startActivity(intent);</p><p> MainActivit
57、y.this.finish();</p><p><b> }</b></p><p><b> });</b></p><p> bt2.setOnClickListener(new OnClickListener(){</p><p><b> @Override</b&
58、gt;</p><p> public void onClick(View v) {</p><p> // TODO Auto-generated method stub</p><p> Intent intent=new Intent();</p><p> intent.setClass(MainActivity.this,M
59、yRegisterActivity.class);</p><p> startActivity(intent);</p><p> MainActivity.this.finish();</p><p><b> }</b></p><p><b> });</b></p>
60、<p><b> }</b></p><p><b> }</b></p><p> 2、MyRegisterActivity類</p><p> public class MyRegisterActivity extends Activity {</p><p> privat
61、e TextView tv1,tv2;</p><p> private Button button2;</p><p> /** Called when the activity is first created. */</p><p><b> @Override</b></p><p> public vo
62、id onCreate(Bundle savedInstanceState) {</p><p> super.onCreate(savedInstanceState);</p><p> setContentView(R.layout.register);</p><p> tv1=(TextView)this.findViewById(R.id._id);
63、</p><p> tv1.setText("賬號(hào)");</p><p> tv2=(TextView)this.findViewById(R.id._pwd);</p><p> tv2.setText("密碼");</p><p> button2=(Button)this.findView
64、ById(R.id.button_confirm);</p><p> button2.setOnClickListener(new Button.OnClickListener(){</p><p><b> @Override</b></p><p> public void onClick(View v) {</p>
65、<p> // TODO Auto-generated method stub</p><p> Intent intent=new Intent();</p><p> intent.setClass(MyRegisterActivity.this, MainActivity.class);</p><p> startActivity(inte
66、nt);</p><p> MyRegisterActivity.this.finish();</p><p><b> }</b></p><p><b> });</b></p><p><b> }</b></p><p><b>
67、; }</b></p><p> 三、用戶之間私聊和群聊類</p><p> 1、MyChatActivity類</p><p><b> /**</b></p><p> * 聊天窗口activity,實(shí)現(xiàn)私聊</p><p> * @author 鐘玉文</p&g
68、t;<p><b> * </b></p><p> * 2012/7/3</p><p><b> *</b></p><p><b> */</b></p><p> public class MyChatActivity extends MyFei
69、GeBaseActivity implements OnClickListener,ReceiveMsgListener{</p><p> //private NetThreadHelper netThreadHelper;</p><p> //private ImageView chat_item_head;//頭像</p><p> privat
70、e TextView chat_name;//名字及IP</p><p> private TextView chat_mood;//組名</p><p> private Button chat_quit;//退出按鈕</p><p> private ListView chat_list;//聊天列表</p><
71、p> private EditText chat_input;//聊天輸入框</p><p> private Button chat_send;//發(fā)送按鈕</p><p> private List<ChatMessage> msgList;//用于顯示的消息list</p><p> private String rece
72、iverName;//要接收本activity所發(fā)送的消息的用戶名字</p><p> private String receiverIp;//要接收本activity所發(fā)送的消息的用戶IP</p><p> private String receiverGroup;//要接收本activity所發(fā)送的消息的用戶組名</p><p> pri
73、vate ChatListAdapter adapter;//ListView對(duì)應(yīng)的adapter</p><p> private String selfName;</p><p> private String selfGroup;</p><p> private final static int MENU_ITEM_SENDFILE = Menu.F
74、IRST;//發(fā)送文件</p><p> private final static int MENU_ITEM_EXIT = Menu.FIRST + 1;</p><p><b> @Override</b></p><p> protected void onCreate(Bundle savedInstanceState) {&l
75、t;/p><p> // TODO Auto-generated method stub</p><p> super.onCreate(savedInstanceState);</p><p> setContentView(R.layout.chat);</p><p> findViews();</p><p&g
76、t; //netThreadHelper = NetThreadHelper.newInstance();</p><p> msgList = new ArrayList<ChatMessage>();</p><p> Intent intent = getIntent();</p><p> Bundle bundle = intent
77、.getExtras();</p><p> receiverName = bundle.getString("receiverName");</p><p> receiverIp = bundle.getString("receiverIp");</p><p> receiverGroup = bundle.get
78、String("receiverGroup");</p><p> selfName = "手機(jī)"+getLocalIpAddress();</p><p> selfGroup = "android";</p><p> chat_name.setText(receiverName + "
79、(" + receiverIp + ")");</p><p> chat_mood.setText("組名:" + receiverGroup);</p><p> chat_quit.setOnClickListener(this);</p><p> chat_send.setOnClickListene
80、r(this);</p><p> Iterator<ChatMessage> it = netThreadHelper.getReceiveMsgQueue().iterator();</p><p> while(it.hasNext()){//循環(huán)消息隊(duì)列,獲取隊(duì)列中與本聊天activity相關(guān)信息</p><p> ChatMessage
81、 temp = it.next();</p><p> //若消息隊(duì)列中的發(fā)送者與本activity的消息接收者IP相同,則將這個(gè)消息拿出,添加到本activity要顯示的消息list中</p><p> if(receiverIp.equals(temp.getSenderIp())){ </p><p> msgList.add(temp);//添加到顯
82、示list</p><p> it.remove();//將本消息從消息隊(duì)列中移除</p><p><b> }</b></p><p><b> }</b></p><p> adapter = new ChatListAdapter(this, msgList);</p>
83、<p> chat_list.setAdapter(adapter);</p><p> netThreadHelper.addReceiveMsgListener(this);//注冊(cè)到listeners</p><p><b> }</b></p><p> private void findViews(){<
84、/p><p> //chat_item_head = (ImageView) findViewById(R.id.chat_item_head);</p><p> chat_name = (TextView) findViewById(R.id.chat_name);</p><p> chat_mood = (TextView) findViewById(
85、R.id.chat_mood);</p><p> chat_quit = (Button) findViewById(R.id.chat_quit);</p><p> chat_list = (ListView) findViewById(R.id.chat_list);</p><p> chat_input = (EditText) findViewB
86、yId(R.id.chat_input);</p><p> chat_send = (Button) findViewById(R.id.chat_send);</p><p><b> }</b></p><p><b> @Override</b></p><p> public vo
87、id processMessage(Message msg) {</p><p> // TODO Auto-generated method stub</p><p> switch(msg.what){</p><p> case IpMessageConst.IPMSG_SENDMSG:</p><p> adapter.not
88、ifyDataSetChanged();//刷新ListView</p><p><b> break;</b></p><p> case IpMessageConst.IPMSG_RELEASEFILES:{ //拒絕接受文件,停止發(fā)送文件線程</p><p> if(NetTcpFileSendThread.server != n
89、ull){</p><p><b> try {</b></p><p> NetTcpFileSendThread.server.close();</p><p> } catch (IOException e) {</p><p> // TODO Auto-generated catch block<
90、/p><p> e.printStackTrace();</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> break;</b><
91、/p><p> case UsedConst.FILESENDSUCCESS:{//文件發(fā)送成功</p><p> makeTextShort("文件發(fā)送成功");</p><p><b> }</b></p><p><b> break;</b></p>
92、<p> }//end of switch</p><p><b> }</b></p><p><b> @Override</b></p><p> public boolean receive(ChatMessage msg) {</p><p> // TODO Aut
93、o-generated method stub</p><p> if(receiverIp.equals(msg.getSenderIp())){//若消息與本activity有關(guān),則接收</p><p> msgList.add(msg);//將此消息添加到顯示list中</p><p> sendEmptyMessage(IpMessageConst
94、.IPMSG_SENDMSG); //使用handle通知,來(lái)更新UI</p><p> MyFeiGeBaseActivity.playMsg();</p><p> return true;</p><p><b> }</b></p><p> return false;</p><p&
95、gt;<b> }</b></p><p><b> @Override</b></p><p> public void finish() {</p><p> // TODO Auto-generated method stub</p><p> //一定要移除,不然信息接收會(huì)出現(xiàn)問(wèn)題
96、</p><p> netThreadHelper.removeReceiveMsgListener(this);</p><p> super.finish();</p><p><b> }</b></p><p><b> @Override</b></p><p&
97、gt; public void onClick(View v) {</p><p> // TODO Auto-generated method stub</p><p> if(v == chat_send){</p><p> sendAndAddMessage();</p><p> }else if(v == chat_q
98、uit){</p><p><b> finish();</b></p><p><b> }</b></p><p><b> }</b></p><p><b> /**</b></p><p> * 發(fā)送消息并將該消
99、息添加到UI顯示</p><p><b> */</b></p><p> private void sendAndAddMessage(){</p><p> String msgStr = chat_input.getText().toString().trim();</p><p> if(!"&
100、quot;.equals(msgStr)){</p><p><b> //發(fā)送消息</b></p><p> IpMessageProtocol sendMsg = new IpMessageProtocol();</p><p> sendMsg.setVersion(String.valueOf(IpMessageConst.VER
101、SION));</p><p> sendMsg.setSenderName(selfName);</p><p> sendMsg.setSenderHost(selfGroup);</p><p> sendMsg.setCommandNo(IpMessageConst.IPMSG_SENDMSG);</p><p> sendM
102、sg.setAdditionalSection(msgStr);</p><p> InetAddress sendto = null;</p><p><b> try {</b></p><p> sendto = InetAddress.getByName(receiverIp);</p><p> } c
103、atch (UnknownHostException e) {</p><p> // TODO Auto-generated catch block</p><p> Log.e("MyFeiGeChatActivity", "發(fā)送地址有誤");</p><p><b> }</b></p&
104、gt;<p> if(sendto != null)</p><p> netThreadHelper.sendUdpData(sendMsg.getProtocolString() + "\0", sendto, IpMessageConst.PORT);</p><p> //添加消息到顯示list</p><p> C
105、hatMessage selfMsg = new ChatMessage("localhost", selfName, msgStr, new Date());</p><p> selfMsg.setSelfMsg(true);//設(shè)置為自身消息</p><p> msgList.add(selfMsg);</p><p><b&
106、gt; }else{</b></p><p> makeTextShort("不能發(fā)送空內(nèi)容");</p><p><b> }</b></p><p> chat_input.setText("");</p><p> adapter.notifyDataS
107、etChanged();//更新UI</p><p><b> }</b></p><p><b> @Override</b></p><p> public boolean onCreateOptionsMenu(Menu menu) {</p><p> // TODO Auto-ge
108、nerated method stub</p><p> super.onCreateOptionsMenu(menu);</p><p> menu.add(0, MENU_ITEM_SENDFILE, 0, "發(fā)送文件");</p><p> menu.add(0, MENU_ITEM_EXIT, 0, "退出");
109、</p><p> return true;</p><p><b> }</b></p><p><b> @Override</b></p><p> public boolean onOptionsItemSelected(MenuItem item) {</p><
110、;p> // TODO Auto-generated method stub</p><p> switch(item.getItemId()){</p><p> case MENU_ITEM_SENDFILE:</p><p> Intent intent = new Intent(this, MyFeiGeFileActivity.class);
111、</p><p> startActivityForResult(intent, 0);</p><p><b> break;</b></p><p> case MENU_ITEM_EXIT:</p><p><b> finish();</b></p><p>
112、<b> break;</b></p><p><b> }</b></p><p> return super.onOptionsItemSelected(item);</p><p><b> }</b></p><p><b> @Override&l
113、t;/b></p><p> protected void onActivityResult(int requestCode, int resultCode, Intent data) {</p><p> // TODO Auto-generated method stub</p><p> super.onActivityResult(request
114、Code, resultCode, data);</p><p> if(resultCode == RESULT_OK){</p><p> //得到發(fā)送文件的路徑</p><p> Bundle bundle = data.getExtras();</p><p> String filePaths = bundle.getStr
115、ing("filePaths");//附加文件信息串,多個(gè)文件使用"\0"進(jìn)行分隔</p><p> //Toast.makeText(this, filePaths, Toast.LENGTH_SHORT).show();</p><p> String[] filePathArray = filePaths.split("\
116、0");</p><p> //發(fā)送傳送文件UDP數(shù)據(jù)報(bào)</p><p> IpMessageProtocol sendPro = new IpMessageProtocol();</p><p> sendPro.setVersion("" +IpMessageConst.VERSION);</p><p&g
117、t; sendPro.setCommandNo(IpMessageConst.IPMSG_SENDMSG | IpMessageConst.IPMSG_FILEATTACHOPT);</p><p> sendPro.setSenderName(selfName);</p><p> sendPro.setSenderHost(selfGroup);</p><p
118、> String msgStr = "";//發(fā)送的消息</p><p> StringBuffer additionInfoSb = new StringBuffer();//用于組合附加文件格式的sb</p><p> for(String path:filePathArray){</p><p> File file =
119、new File(path);</p><p> additionInfoSb.append("0:");</p><p> additionInfoSb.append(file.getName() + ":");</p><p> additionInfoSb.append(Long.toHexString(file.
120、length()) + ":");//文件大小十六進(jìn)制表示</p><p> additionInfoSb.append(Long.toHexString(file.lastModified()) + ":");//文件創(chuàng)建時(shí)間,現(xiàn)在暫時(shí)已最后修改時(shí)間替代</p><p> additionInfoSb.append(IpMessageCo
121、nst.IPMSG_FILE_REGULAR + ":");</p><p> byte[] bt = {0x07};//用于分隔多個(gè)發(fā)送文件的字符</p><p> String splitStr = new String(bt);</p><p> additionInfoSb.append(splitStr);</p>
122、<p><b> }</b></p><p> sendPro.setAdditionalSection(msgStr + "\0" + additionInfoSb.toString() + "\0");</p><p> InetAddress sendto = null;</p><
123、p><b> try {</b></p><p> sendto = InetAddress.getByName(receiverIp);</p><p> } catch (UnknownHostException e) {</p><p> // TODO Auto-generated catch block</p>
124、;<p> Log.e("MyFeiGeChatActivity", "發(fā)送地址有誤");</p><p><b> }</b></p><p> if(sendto != null)</p><p> netThreadHelper.sendUdpData(sendPro.getP
125、rotocolString(), sendto, IpMessageConst.PORT);</p><p> //監(jiān)聽(tīng)2425端口,準(zhǔn)備接受TCP連接請(qǐng)求</p><p> Thread netTcpFileSendThread = new Thread(new NetTcpFileSendThread(filePathArray));</p><p> n
126、etTcpFileSendThread.start();//啟動(dòng)線程</p><p><b> }</b></p><p><b> }</b></p><p> //得到本機(jī)IP地址</p><p> public String getLocalIpAddress(){</p>
127、;<p><b> try{</b></p><p> Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); </p><p> while(en.hasMoreElements()){</p><p> Netw
128、orkInterface nif = en.nextElement();</p><p> Enumeration<InetAddress> enumIpAddr = nif.getInetAddresses();</p><p> while(enumIpAddr.hasMoreElements()){</p><p> InetAddress
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 嵌入式課程設(shè)計(jì)之a(chǎn)ndroid聊天室
- java課程設(shè)計(jì)之簡(jiǎn)單聊天室
- web課程設(shè)計(jì)—— 聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)報(bào)告-android_socket_聊天室
- java課程設(shè)計(jì)--聊天室系統(tǒng)
- java網(wǎng)絡(luò)聊天室課程設(shè)計(jì)
- java課程設(shè)計(jì)---聊天室系統(tǒng)
- tcp課程設(shè)計(jì)--網(wǎng)絡(luò)聊天室
- 聊天室課程設(shè)計(jì)---聊天程序的設(shè)計(jì)和實(shí)現(xiàn)
- jsp課程設(shè)計(jì)報(bào)告--在線聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)---網(wǎng)絡(luò)聊天室
- 《web開(kāi)發(fā)》課程設(shè)計(jì)報(bào)告--聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)-java聊天室
- 軟件課程設(shè)計(jì)報(bào)告---簡(jiǎn)易網(wǎng)絡(luò)聊天室
- 軟件工程課程設(shè)計(jì)--- 文本聊天室
- vc++課程設(shè)計(jì)--聊天室程序設(shè)計(jì)
- mfc課程設(shè)計(jì)報(bào)告---聊天室程序設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)
- 課程設(shè)計(jì)--基于qt的局域網(wǎng)聊天室
評(píng)論
0/150
提交評(píng)論