Monday, April 15, 2013

Socket trong Android

Trong bài này mình sẽ giới thiệu với các bạn về lập trình Socket(bài này mình chỉ nói đến lập trình Socket cho TCP/IP) trong Android.
Lập trình Socket chắc hẳn rất quen thuộc với các bạn học CNTT, vì thế mình chỉ nói lại một số vấn đề chính liên quan đến Socket:
- Socket là một phương pháp để thiết lập kết nối truyền thông giữa một chương trình yêu cầu dịch vụ ( client) và một chương trình cung cấp dịch vụ (server) trên mạng LAN, WAN hay Internet. Một socket trên máy yêu cầu dịch vụ có địa chỉ mạng được cấp sẵn để gọi một socket trên máy cung cấp dịch vụ. Một khi socket đó được thiết lập phù hợp, hai bên có thể trao đổi dịch vụ và dữ liệu.
-Tóm váy lại là thằng Server thì phải tạo một Server luôn luôn lắng nghe (luôn luôn thấu hiểu) ở một cổng nào đó ví dụ 8888 chẳng hạn. Thằng Client muốn kết nối được đến Server để gửi yêu cầu thì phải xác định được cổng đó và IP của Server.


Cơ bản về lý thuyết chỉ có thế, các bạn muốn tìm hiểu kĩ thì cứ Google mà tra, sau đây là phần Socket cho Android. Mình sẽ làm một ví dụ minh họa: Bên Client sẽ gửi 2 số sang bên Server, Server nhận được sẽ tính tổng 2 số đó và gửi lại Client hiển thị

1.Về Server:
Các bạn có thể viết Server bằng bất kỳ ngôn ngữ j, ở đây mình viết bằng Java cho mọi người dễ hiểu:

-Đầu tiên ta tạo một class ServerSocket với port 9999: (chú ý phải đặt trong try catch)


Code:
ServerSocket ss=new ServerSocket(9999);
-Tạo vòng lặp để luôn lắng nghe yêu cầu của Client:
Code:
while (true){
Socket cl=ss.accept();//Chap nhan client ket noi den
System.out.printf("Client Connect");

BufferedReader br=new BufferedReader(new InputStreamReader(cl.getInputStream())); //Khoi tao luong doc du lieu
String a=br.readLine();
String b=br.readLine();//Doc 2 so a va b client gui den

PrintWriter pr=new PrintWriter(cl.getOutputStream(),true);//Khoi toi luong ghi du lieu
float c=Float.parseFloat(a)+Float.parseFloat(b);
pr.println(c);
cl.close();
}

2.Về bên Client:(Viết trên Android)
Các bạn New một project mới và tạo các file như sau:
-Khởi tạo giao diện: chúng ta thiết kế một layout bao gồm các TextView, EditText để nhập 2 số a, b và hiển thị kết quả. Ngoài ra ta thêm một nút Tinh để gửi a, b cho bên Server.
Code: main.xml

Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
>
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_height="wrap_content"
android:layout_width="wrap_content">
<TextView
android:text="Nhap so thu 1:"
android:layout_width="100dp"
android:layout_height="wrap_content">
</TextView>
<EditText
android:hint=" a "
android:id="@+id/a"
android:layout_width="150dp"
android:layout_height="wrap_content">
</EditText>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_height="wrap_content"
android:layout_width="wrap_content">
<TextView
android:text="Nhap so thu 2:"
android:layout_width="100dp"
android:layout_height="wrap_content">
</TextView>
<EditText
android:hint=" b "
android:id="@+id/b"
android:layout_width="150dp"
android:layout_height="wrap_content">
</EditText>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout3"
android:layout_height="wrap_content"
android:layout_width="wrap_content">
<TextView
android:text="Ketqua: "
android:layout_width="100dp"
android:layout_height="wrap_content">
</TextView>
<EditText
android:hint=" "
android:id="@+id/kqua"
android:layout_width="150dp"
android:layout_height="wrap_content">
</EditText>
</LinearLayout>
<Button
android:text="Tinh"
android:id="@+id/tinh"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>

</LinearLayout>
 
 
-Tiếp theo, ta mở file mainActivity.java (do các bạn tự đặt tên khi tạo Project)

+Tạm thời để cái hàm onCreat sang một bên, ta xử lý sau, ta đi xây
dựng hàm kết nối, gửi nhận dữ liệu với server thông qua IP và port, hàm
này sẽ trả lại cho ta giá trị tổng của 2 số a và b ta nhập vào từ các
EditText:
public String connectSever(final String ip, final String port, final float a,final float b){
String output=null;
try {
Socket cl=new Socket(ip,Integer.parseInt(port));//ket noi server

PrintWriter pw=new PrintWriter(cl.getOutputStream(),true);//tao luong gui du lieu
pw.println(""+a);
pw.println(""+b);

BufferedReader br=new BufferedReader(new InputStreamReader(cl.getInputStream()));//tao luong nhan du lieu
output=br.readLine();
cl.close();
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


return output;//tra ve ket qua cua a+b
}
 
        +Bây giờ chúng ta chỉ phải hiển thị cái layout và xử lý sự kiện cho nút bấm trong hàm onCreat:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final EditText ed1=(EditText)findViewById(R.id.a);
final EditText ed2=(EditText)findViewById(R.id.b);
final EditText ed3=(EditText)findViewById(R.id.kqua);
Button tinh=(Button)findViewById(R.id.tinh);

View.OnClickListener tinhOnClick=new OnClickListener() {

public void onClick(View v) {
// TODO Auto-generated method stub
String op=connectSever("10.0.2.2", "9999", Float.parseFloat(ed1.getText().toString()), Float.parseFloat(ed2.getText().toString()));
ed3.setText(op);
}
};
tinh.setOnClickListener(tinhOnClick);
}
 
 
 
 
 



No comments:

Post a Comment