嵌入式課程設計之a(chǎn)ndroid聊天室_第1頁
已閱讀1頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  課程設計報告</b></p><p>  課程設計題目: Android聊天室 </p><p>  學 院: 計算機學院 </p><p>  專業(yè)班級: 網(wǎng)絡工程2班 </p>

2、<p>  年 級: 2009級 </p><p>  姓 名: x x x 學 號: </p><p>  完成時間: 2012 年 7 月 5 日<

3、;/p><p>  成 績: </p><p>  指導教師: 李季 </p><p><b>  摘要</b></p><p>  本次課程設計是以嵌入式系統(tǒng)課程和理論知識為基礎,通過課程設計的實

4、踐,培養(yǎng)學生理論聯(lián)系實際的思想,加強學生對所修相關課程的理解、掌握,訓練并提高學生Android應用軟件的設計、編程能力,獨立解決問題的思路。</p><p>  此系統(tǒng)設計了一個基于Android系統(tǒng)與PC之間的通信,采用Socket流式套接字進行網(wǎng)絡通信。其中Android系統(tǒng)的模擬器作為客戶端,客戶端采用獲取手機號碼作為該客戶端的唯一標識,PC作為服務器端。依據(jù)Android應用程序的仿真器,我們實現(xiàn)了多個

5、應用客服端及服務器端的通信,其中,客服端之間可以相互進行單獨的文本通信(私聊),也可以進行群聊。同時,客服端也可以進行文件的傳輸。</p><p>  關鍵詞:Android;Socket通信;私聊;群聊;文件傳輸</p><p><b>  目錄</b></p><p>  一、聊天室的描述1</p><p>  1

6、.1聊天室的設計背景1</p><p>  1.2聊天室的基本功能1</p><p>  二、聊天室的設計2</p><p>  2.1聊天室的粗略設計分析2</p><p>  2.2聊天室的具體設計分析3</p><p>  三、聊天室的實現(xiàn)6</p><p>  3.1聊天室所

7、使用的類及功能的實現(xiàn)6</p><p><b>  四、運行結(jié)果36</b></p><p>  五、課程設計存在問題、解決方法及總結(jié)43</p><p>  5.1系統(tǒng)存在的問題43</p><p>  5.2系統(tǒng)改進方法43</p><p><b>  5.3總結(jié)44&l

8、t;/b></p><p>  六、 參考文獻44</p><p><b>  一、聊天室的描述</b></p><p>  1.1聊天室的設計背景</p><p>  當今社會,網(wǎng)絡技術越來越發(fā)展,可以說,二十一世紀就是網(wǎng)絡的世紀。網(wǎng)絡迅猛發(fā)展,勢不可擋。為了實現(xiàn)資源共享,各式各樣的網(wǎng)站發(fā)展迅速,各種各樣的聊天

9、工具不斷更新。所以制作一個聊天室勢在必行。</p><p>  為了實現(xiàn)一個更好的網(wǎng)絡交互平臺,各用戶之間能夠?qū)崟r方便的傳遞信息,按照用戶對系統(tǒng)的要求不同,可以在聊天室里實現(xiàn)公共聊天,也可以邀幾個私交好友私聊,同時提供了兩個用戶之間能夠傳送文件。本系統(tǒng)是基于方便用戶聊天,傳遞信息,共享資源,所以系統(tǒng)的功能主要是從以上幾個模塊著手。</p><p>  本項目主要是利用Android制作一個

10、聊天室,采用的是客戶/服務器。 二層的C/S結(jié)構(gòu)是指以單一的服務器和局域網(wǎng)為核心,能通過客戶端與用戶進行直接對話。主要有二大功能:一是它用于檢查用戶從鍵盤等輸入的數(shù)據(jù),顯示應用輸出的數(shù)據(jù)。為使用戶能直觀地進行操作,一般要使用圖形用戶接口,操作簡單、易學易用。在變更用戶接口時,只需改寫顯示控制和數(shù)據(jù)檢查程序,而不影響其他。檢查的內(nèi)容也只限于數(shù)據(jù)的形式和值的范圍,不包括有關業(yè)務本身的處理邏輯。典型的C/S結(jié)構(gòu)有以下特點:</p>

11、<p>  1、服務器負責數(shù)據(jù)管理及程序處理。</p><p>  2、客戶機負責界面描述和界面顯示。</p><p>  3、客戶機向服務器提出處理要求。</p><p>  4、服務器響應將處理結(jié)果返回客戶機。</p><p>  5、使網(wǎng)絡數(shù)據(jù)流量最少。</p><p>  1.2聊天室的基本功能&

12、lt;/p><p><b>  用戶注冊 </b></p><p><b>  用戶登錄</b></p><p><b>  用戶公聊</b></p><p><b>  用戶私聊</b></p><p><b>  傳輸文件

13、</b></p><p><b>  用戶注冊</b></p><p>  第一次用戶需要提供個人注冊信息,注冊的用戶名不能重復,個人信息必須提供完整。</p><p><b>  用戶登錄</b></p><p>  用戶輸入用戶名和密碼,提交給將服務器端的確認,根據(jù)從服務器中傳過來的

14、確認信息,判斷用戶登錄的情況。并且把此次登錄的時間及登錄的IP記錄在服務器。</p><p>  如果用戶名和密碼正確的話,則登錄聊天室主界面;如果已經(jīng)在線,則輸出已經(jīng)在線;否則輸出用戶名和密碼錯誤,需要重新登錄或者注冊。</p><p><b>  用戶公聊</b></p><p>  用戶輸入的用戶名和密碼都正確后,則進入聊天室。聊天主界面

15、主要由四大版塊組成:公聊的聊天信息、在線用戶列表、系統(tǒng)消息和聊天的一些操作。</p><p><b>  用戶私聊</b></p><p>  如果兩個人聊的話題比較隱秘,不想被其他人看到,就要使用私聊。在這里,如果說話對象是所有人的話,不能選擇私聊;從當前好友列表中選擇了一個用戶之后,則私聊對話框應該彈出來。</p><p><b>

16、;  文件傳遞</b></p><p>  兩個用戶在聊天過程中,可能需要相互間傳送文件。象用戶聊天信息和在線用戶這樣一些信息都是保存在服務器端,然后每個客戶讀取服務器端向量中的內(nèi)容,此時服務器與客戶端的聯(lián)系是一對多的,而傳送文件是一對一的。所以直接傳送,不需要經(jīng)過服務器端保存。</p><p><b>  二、聊天室的設計</b></p>

17、<p>  2.1聊天室的粗略設計分析</p><p>  1、聊天系統(tǒng)平臺應有兩個部分組成:服務端和客戶端。服務端主要完成用戶信息的存儲、客戶端命令的接受與響應以及信息轉(zhuǎn)發(fā)等服務端應有的功能??蛻舳酥饕瓿闪奶煨畔⒌陌l(fā)送與接受、登錄等功能。</p><p>  此系統(tǒng)使用的是TCP/IP協(xié)議,應用了如下通訊模式:</p><p>  2、在網(wǎng)絡上的兩個

18、程序通過一個雙向的通信鏈路實現(xiàn)數(shù)據(jù)交換,這個雙向鏈路的一段就被稱為一個Socket,Socket通常用來實現(xiàn)客戶端和服務器端的鏈接。Socket是TCP/IP協(xié)議的一個十分流行的編程界面,一個Socket有一個IP地址和一個端口號確定。在Java環(huán)境中實現(xiàn)基于TCP/IP協(xié)議的網(wǎng)絡編程都需要采用Socket機制。并且與基于URL的網(wǎng)絡編程Socket編程提供更高的傳輸效率。</p><p>  Socket通常采

19、用C/S結(jié)構(gòu),使用Socket進行C/S程序設計的一般鏈接過程如下圖:</p><p>  圖1.1 Socket編程連接一般過程</p><p>  2.2聊天室的具體設計分析</p><p>  根據(jù)課程設計的要求及項目的需求分析,聊天程序應實現(xiàn)以下幾項功能:登錄、注冊、公聊、私聊、文件傳送等。</p><p>  當客戶程序需要與服務器

20、程序通訊的時候,客戶程序在客戶機創(chuàng)建一個socket對象。創(chuàng)建了一個Socket對象后,那么它可以通過調(diào)用Socket的getInputStream()方法從服務程序獲得輸入流讀傳送來的信息,也可以通過調(diào)用Socket的getOutputStream()方法獲得輸出流來發(fā)送消息。</p><p>  由于Client使用了流套接字,所以服務程序也要使用流套接字。這就要創(chuàng)建一個ServerSocket對象,接下來服

21、務程序進入無限循環(huán)之中,無限循環(huán)從調(diào)用ServerSocket的accept()方法開始,在調(diào)用開始后accept()方法將導致調(diào)用線程阻塞直到連接建立。在建立連接后accept()返回一個最近創(chuàng)建的Socket對象,該Socket對象綁定了客戶程序的IP地址或端口號。由于存在單個服務程序與多個客戶程序通訊的可能,服務程序循環(huán)檢測是否有客戶連接到服務器上,如果有,則創(chuàng)建一個線程來服務這個客戶,以此完成對客戶端的監(jiān)聽。</p>

22、<p>  在客戶端程序?qū)崿F(xiàn)了界面的顯示以及與服務器端的數(shù)據(jù)交互。各模塊主要功能及名稱如下:</p><p>  具體流程如下圖所示:</p><p><b>  未注冊用戶:</b></p><p><b>  主界面</b></p><p><b>  已注冊用戶:<

23、;/b></p><p><b>  三、聊天室的實現(xiàn)</b></p><p>  3.1聊天室所使用的類及功能的實現(xiàn)</p><p><b>  服務器啟動類</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("啟動服務器");</p><p>  jButton2.setText("關閉服務器");</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("服務器地址: "+ip+"端口號: "+</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>  用戶登陸和注冊類</b></p><p>  1、MainActivity類<

50、;/p><p><b>  /**</b></p><p>  * 登陸的主要Activity,實現(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("賬號");</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("賬號");</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,實現(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對應的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 = "手機"+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)消息隊列,獲取隊列中與本聊天activity相關信息</p><p>  ChatMessage

81、 temp = it.next();</p><p>  //若消息隊列中的發(fā)送者與本activity的消息接收者IP相同,則將這個消息拿出,添加到本activity要顯示的消息list中</p><p>  if(receiverIp.equals(temp.getSenderIp())){ </p><p>  msgList.add(temp);//添加到顯

82、示list</p><p>  it.remove();//將本消息從消息隊列中移除</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);//注冊到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有關,則接收</p><p>  msgList.add(msg);//將此消息添加到顯示list中</p><p>  sendEmptyMessage(IpMessageConst

94、.IPMSG_SENDMSG); //使用handle通知,來更新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>  //一定要移除,不然信息接收會出現(xià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);//設置為自身消息</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");//附加文件信息串,多個文件使用"\0"進行分隔</p><p>  //Toast.makeText(this, filePaths, Toast.LENGTH_SHORT).show();</p><p>  String[] filePathArray = filePaths.split("\

116、0");</p><p>  //發(fā)送傳送文件UDP數(shù)據(jù)報</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()) + ":");//文件大小十六進制表示</p><p>  additionInfoSb.append(Long.toHexString(file.lastModified()) + ":");//文件創(chuàng)建時間,現(xiàn)在暫時已最后修改時間替代</p><p>  additionInfoSb.append(IpMessageCo

121、nst.IPMSG_FILE_REGULAR + ":");</p><p>  byte[] bt = {0x07};//用于分隔多個發(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)聽2425端口,準備接受TCP連接請求</p><p>  Thread netTcpFileSendThread = new Thread(new NetTcpFileSendThread(filePathArray));</p><p>  n

126、etTcpFileSendThread.start();//啟動線程</p><p><b>  }</b></p><p><b>  }</b></p><p>  //得到本機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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論