Socket通訊1——Android手機客戶端和電腦服務器通訊小例子

TCP Socket 通訊 主要實現客戶端和服務器的鏈接以及發送一條消息:java

 
前提:電腦端當作服務器,Android手機做爲客戶端,在同一個局域網內

流程:android

1.電腦端服務器打開,監聽端口號:9998服務器

2.當手機連上服務器,發送 "您好,服務器!"的消息,服務器經過DataInputStream接收以後,打印出來app

3.服務器接收並打印消息以後,隨機發送「您好,客戶端!」的消息給手機客戶端異步

手機剛打開客戶端的界面:
剛打開客戶端socket

手機點擊"鏈接服務器"以後,服務器收到消息:
手機點擊"鏈接服務器"以後,服務器收到消息ide

服務器返回給客戶端的消息:
服務器返回給客戶端的消息oop

電腦服務器:spa

 1 package TestSocket;
 2 
 3 import java.io.DataInputStream;
 4 import java.io.DataOutputStream;
 5 import java.io.IOException;
 6 import java.net.*;
 7 
 8 import javax.net.ssl.SSLContext;
 9 
10 public class TcpServer {
11 
12     /**
13      * 電腦服務器端,監聽端口號9998,接收消息以後,再回復消息
14      * 
15      * @param args
16      * @throws IOException 
17      */
18     public static void main(String[] args) throws IOException {
19         while (true) {
20             ServerSocket ss = new ServerSocket(9998);// 監聽9998端口
21             Socket socket = ss.accept();
22             //等待客戶端連上,並等待接收數據
23             DataInputStream dis = new DataInputStream(socket.getInputStream());
24             System.out.println(dis.readUTF()); //打印出客戶端發來的數據
25             //回覆消息給客戶端
26             DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
27             dos.writeUTF("您好,客戶端!");
28             ss.close();//通訊完以後要關閉,否則下次會報錯
29             dos.close();
30             dis.close();
31         }
32     }
33 
34 }

 


Android手機客戶端程序
main.xml.net

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="fill_parent"
 4     android:layout_height="fill_parent" >
 5 
 6     <TextView
 7         android:id="@+id/tv"
 8         android:layout_width="wrap_content"
 9         android:layout_height="wrap_content"
10         android:layout_centerHorizontal="true"
11         android:layout_centerVertical="true"
12         android:text="@string/hello_world"
13         />
14 
15     <Button
16         android:id="@+id/btnconnect"
17         android:layout_width="wrap_content"
18         android:layout_height="wrap_content"
19         android:text="鏈接服務器" />
20 
21 </RelativeLayout>

 

MainActivity.java 文件

 1 package com.example.socketclient;
 2 
 3 import android.os.Bundle;
 4 import android.os.Handler;
 5 import android.os.Looper;
 6 import android.os.Message;
 7 import android.app.Activity;
 8 import android.content.DialogInterface;
 9 import android.util.Log;
10 import android.view.View;
11 import android.view.View.OnClickListener;
12 import android.view.Menu;
13 import android.widget.Button;
14 import android.widget.TextView;
15 import android.widget.Toast;
16 
17 import java.io.DataInputStream;
18 import java.io.DataOutputStream;
19 import java.io.IOException;
20 import java.net.*;
21 
22 public class MainActivity extends Activity {
23     TextView tv;// 用來顯示服務器返回的消息 :「您好,客戶端!」
24     Handler mHandler;
25 
26     @Override
27     public void onCreate(Bundle savedInstanceState) {
28         super.onCreate(savedInstanceState);
29         setContentView(R.layout.main);
30         Button btn = (Button) findViewById(R.id.btnconnect);// 鏈接服務器的按鈕
31         btn.setOnClickListener(listener);
32         tv = (TextView) findViewById(R.id.tv);
33         mHandler = new MessageHandler();
34     }
35 
36     OnClickListener listener = new OnClickListener() {
37 
38         @Override
39         public void onClick(View v) {
40             new ReceiveMessageThread().start();// 開啓客戶端線程
41         }
42     };
43 
44     /**
45      * 異步操做,TextView顯示服務器發來的消息
46      * 
47      * @author S.Rain
48      * 
49      */
50     class MessageHandler extends Handler {
51 
52         @Override
53         public void handleMessage(Message msg) {
54             tv.setText(msg.obj.toString());//接收客戶端線程發來的Message對象,用來顯示
55         }
56 
57     }
58 
59     /**
60      * 客戶端線程。連到服務器:192.168.1.102:9998 發送消息,以後接收服務器消息,並在TextView顯示
61      * 
62      * @author S.Rain
63      * 
64      */
65     class ReceiveMessageThread extends Thread {
66 
67         public void run() {
68             try {
69                 Socket socket = new Socket("192.168.1.104", 9998);
70                 DataOutputStream dos = new DataOutputStream(
71                         socket.getOutputStream());
72                 dos.writeUTF("您好,服務器!");
73 
74                 DataInputStream dis = new DataInputStream(
75                         socket.getInputStream());
76                 Message msg = mHandler.obtainMessage();
77                 msg.obj = dis.readUTF();
78                 mHandler.sendMessage(msg);
79                 socket.close();
80                 dos.close();
81                 dis.close();
82             } catch (IOException e) {
83                 // TODO Auto-generated catch block
84                 e.printStackTrace();
85             }
86 
87         }
88     }
89 
90     @Override
91     public boolean onCreateOptionsMenu(Menu menu) {// 沒用,工程建立時本身生成的
92         getMenuInflater().inflate(R.menu.main, menu);
93         return true;
94     }
95 }
相關文章
相關標籤/搜索