2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩47頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論