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 }