Socket Communication for Android Network Programming
Socket (Socket) is a communication mechanism that enables communication between a single machine or a cross-network. To create a Socket, you must clearly distinguish between C (client)/S (server ), multiple clients can be connected to the same server. There are two transmission modes:
1) connection-oriented transmission: Based on TCP protocol, high reliability, but low efficiency;
2) connectionless transmission: UDP-based, low reliability, but high efficiency;
In Android, direct Socket communication should be the lowest network application we have ever encountered. Although a large degree of abstraction has been made, pure Socket communication still leaves developers with a lot of details to handle, especially on the server side, developers need to deal with design issues such as multithreading and data buffering. Relatively speaking, HTTP at a higher abstraction layer has encapsulated the technical details to be processed in Socket communication, so developers do not need to care about it. Therefore, HTTP usually has a decisive advantage in network development.
Android provides Socket class for the client and ServerSocket class for the server in the java package of its core library, they are located at $ SOURCE/libcore/luni/src/main/java/net/Socket. java and $ SOURCE/libcore/luni/src/main/java/net/ServerSocket. java file. By analyzing the source code of the two classes, we can see that the encapsulation is very comprehensive. Only the constructor method has always considered many usage cases for each class. As I am a beginner and do not understand much about it, here I will introduce one of the constructor methods of the two classes, which is used in my program below:
Socket (String dstName, int dstPort): Create a client Socket to connect to the target machine (this can be understood as a server) in the stream mode (based on the TCP protocol; dstName is the IP address of the target machine, and dstPort is the port number of the target machine to be connected. Note the understanding of the port. It cannot be understood as a physical interface, but an image of a special memory area in the computer.
ServerSocket (int aport): Creates a server Socket bound to the specified port on the local machine. aport is the specified local port. In contrast to the preceding client Socket, after a TCP connection is established, the ServerSocket must listen on the aport port and wait for the connection from the client.
Start service and activity
MContext. startService (new Intent (mContext, SocketService. class ));
Intent intent = new Intent ();
Intent. setClass (mContext, SocketClientDemo. class );
MContext. startActivity (intent );
Service: Server
Package com. android. settings;
Import java. io. BufferedReader;
Import java. io. BufferedWriter;
Import java. io. IOException;
Import java. io. InputStreamReader;
Import java. io. OutputStreamWriter;
Import java. io. PrintWriter;
Import java.net. ServerSocket;
Import java.net. Socket;
Import android. app. Service;
Import android. content. Intent;
Import android. OS. IBinder;
Public class SocketService extends Service {
Thread mServiceThread;
Socket client;
@ Override
Public IBinder onBind (Intent intent ){
// TODO Auto-generated method stub
Return null;
}
@ Override
Public void onCreate (){
// TODO Auto-generated method stub
Super. onCreate ();
MServiceThread = new Thread (new SocketServerThread ());
}
@ Override
Public void onStart (Intent intent, int startId ){
// TODO Auto-generated method stub
Super. onStart (intent, startId );
MServiceThread. start ();
}
@ Override
Public void onDestroy (){
// TODO Auto-generated method stub
Super. onDestroy ();
}
Public class SocketServerThread extends Thread {
Private static final int PORT = 54321;
Private SocketServerThread (){
}
@ Override
Public void run (){
Try {
ServerSocket server = new ServerSocket (PORT );
While (true ){
System. out. println ("tian begin client connected ");
Client = server. accept ();
System. out. println ("tian client connected ");
BufferedReader reader = new BufferedReader (
New InputStreamReader (client. getInputStream ()));
System. out. println ("tian read from client :");
String textLine = reader. readLine ();
If (textLine. equalsIgnoreCase ("EXIT ")){
System. out
. Println ("tian EXIT invoked, closing client ");
Break;
}
System. out. println (textLine );
PrintWriter writer = new PrintWriter (new BufferedWriter (
New OutputStreamWriter (client. getOutputStream ())));
System. out. println ("return tian read from client :"
+ TextLine );
Writer. println ("tian ECHO from server:" + textLine );
Writer. flush ();
Writer. close ();
Reader. close ();
}
} Catch (IOException e ){
// TODO Auto-generated catch block
System. err. println (e );
}
}
}
}
Package com. android. settings;
Import java. io. BufferedReader;
Import java. io. BufferedWriter;
Import java. io. IOException;
Import java. io. InputStreamReader;
Import java. io. OutputStreamWriter;
Import java. io. PrintWriter;
Import java.net. Socket;
Import java.net. UnknownHostException;
Import android. app. Activity;
Import android. OS. Bundle;
Import android. OS. Handler;
Import android. OS. Message;
Import android. util. Log;
Import android. view. View;
Import android. view. View. OnClickListener;
Import android. widget. Button;
Import android. widget. EditText;
Import android. widget. TextView;
Public class SocketClientDemo extends Activity {
Private static final String SERVERIP = "127.0.0.1 ";
Private static final int SERVERPORT = 54321;
Private static final String TAG = "SocketClientDemo ";
TextView mMsgRev;
EditText mMsgEdit;
Button mMsgSendBtn;
String mSendMsg;
String mReceivedMsg;
Class MyThread implements Runnable {
Private String name;
Public MyThread (String name ){
This. name = name;
}
Public void run (){
// For (int I = 0; I <100; I ++ ){
// System. out. println ("thread start:" + this. name + ", I =" + I );
Log. d (TAG, "MyThread execu ");
//}
}
};
Class MyThread2 extends Thread {
@ Override
Public void run (){
// TODO Auto-generated method stub
Log. d (TAG, "MyThread2 execu ");
}
};
Class MyThread3 extends Thread {
Private String name;
Public MyThread3 (String name ){
// Super ();
This. name = name;
}
@ Override
Public void run (){
// TODO Auto-generated method stub
Log. d (TAG, "MyThread3 execu" + "name =" + name );
Socket socket = null;
MSendMsg = mMsgEdit. getText (). toString ();
Try {
Socket = new Socket (SERVERIP, SERVERPORT );
PrintWriter writer = new PrintWriter (new BufferedWriter (
New OutputStreamWriter (socket. getOutputStream ())));
Writer. println (mSendMsg );
Writer. flush ();
BufferedReader reader = new BufferedReader (
New InputStreamReader (socket. getInputStream ()));
MReceivedMsg = reader. readLine ();
Message meaage = mHander. obtainMessage ();
Meaage. arg1 = 1;
MHander. sendMessage (meaage );
Writer. close ();
Reader. close ();
Socket. close ();
} Catch (UnknownHostException e ){
// TODO Auto-generated catch block
E. printStackTrace ();
} Catch (IOException e ){
// TODO Auto-generated catch block
E. printStackTrace ();
}
}
}
/** Called when the activity is first created .*/
@ Override
Public void onCreate (Bundle savedInstanceState ){
Super. onCreate (savedInstanceState );
SetContentView (R. xml. beidou_detail_preference_settings );
MMsgRev = (TextView) findViewById (R. id. receive_msg );
MMsgEdit = (EditText) findViewById (R. id. edit_msg );
MMsgSendBtn = (Button) findViewById (R. id. send_msg );
MMsgSendBtn. setOnClickListener (new OnClickListener (){
@ Override
Public void onClick (View v ){
/*
* MyThread thread = new MyThread ("00"); new
* Thread (thread). start ();
*
* New MyThread2 (). start ();
*/
MyThread3 thread3 = new MyThread3 ("33 ");
Thread3.start ();
}
});
}
Final Handler mHander = new Handler (){
@ Override
Public void handleMessage (Message msg ){
// TODO Auto-generated method stub
If (mReceivedMsg! = Null ){
MMsgRev. setText (mReceivedMsg );
} Else {
MMsgRev. setText ("tian receive data error ");
}
Super. handleMessage (msg );
}
};
}
Activity: Client
Package com. android. settings;
Import java. io. BufferedReader;
Import java. io. BufferedWriter;
Import java. io. IOException;
Import java. io. InputStreamReader;
Import java. io. OutputStreamWriter;
Import java. io. PrintWriter;
Import java.net. Socket;
Import java.net. UnknownHostException;
Import android. app. Activity;
Import android. OS. Bundle;
Import android. OS. Handler;
Import android. OS. Message;
Import android. util. Log;
Import android. view. View;
Import android. view. View. OnClickListener;
Import android. widget. Button;
Import android. widget. EditText;
Import android. widget. TextView;
Public class SocketClientDemo extends Activity {
Private static final String SERVERIP = "127.0.0.1 ";
Private static final int SERVERPORT = 54321;
Private static final String TAG = "SocketClientDemo ";
TextView mMsgRev;
EditText mMsgEdit;
Button mMsgSendBtn;
String mSendMsg;
String mReceivedMsg;
Class MyThread implements Runnable {
Private String name;
Public MyThread (String name ){
This. name = name;
}
Public void run (){
// For (int I = 0; I <100; I ++ ){
// System. out. println ("thread start:" + this. name + ", I =" + I );
Log. d (TAG, "MyThread execu ");
//}
}
};
Class MyThread2 extends Thread {
@ Override
Public void run (){
// TODO Auto-generated method stub
Log. d (TAG, "MyThread2 execu ");
}
};
Class MyThread3 extends Thread {
Private String name;
Public MyThread3 (String name ){
// Super ();
This. name = name;
}
@ Override
Public void run (){
// TODO Auto-generated method stub
Log. d (TAG, "MyThread3 execu" + "name =" + name );
Socket socket = null;
MSendMsg = mMsgEdit. getText (). toString ();
Try {
Socket = new Socket (SERVERIP, SERVERPORT );
PrintWriter writer = new PrintWriter (new BufferedWriter (
New OutputStreamWriter (socket. getOutputStream ())));
Writer. println (mSendMsg );
Writer. flush ();
BufferedReader reader = new BufferedReader (
New InputStreamReader (socket. getInputStream ()));
MReceivedMsg = reader. readLine ();
Message meaage = mHander. obtainMessage ();
Meaage. arg1 = 1;
MHander. sendMessage (meaage );
Writer. close ();
Reader. close ();
Socket. close ();
} Catch (UnknownHostException e ){
// TODO Auto-generated catch block
E. printStackTrace ();
} Catch (IOException e ){
// TODO Auto-generated catch block
E. printStackTrace ();
}
}
}
/** Called when the activity is first created .*/
@ Override
Public void onCreate (Bundle savedInstanceState ){
Super. onCreate (savedInstanceState );
SetContentView (R. xml. beidou_detail_preference_settings );
MMsgRev = (TextView) findViewById (R. id. receive_msg );
MMsgEdit = (EditText) findViewById (R. id. edit_msg );
MMsgSendBtn = (Button) findViewById (R. id. send_msg );
MMsgSendBtn. setOnClickListener (new OnClickListener (){
@ Override
Public void onClick (View v ){
/*
* MyThread thread = new MyThread ("00"); new
* Thread (thread). start ();
*
* New MyThread2 (). start ();
*/
MyThread3 thread3 = new MyThread3 ("33 ");
Thread3.start ();
}
});
}
Final Handler mHander = new Handler (){
@ Override
Public void handleMessage (Message msg ){
// TODO Auto-generated method stub
If (mReceivedMsg! = Null ){
MMsgRev. setText (mReceivedMsg );
} Else {
MMsgRev. setText ("tian receive data error ");
}
Super. handleMessage (msg );
}
};
}