Android的socket的通信主要包括Tcp和UDP二种通信模型;
TCP主要是安全的协议,主要用于传送文件,需要三次握手
UDP是不安全的协议,主要用于传输数据量比较大,且实时性要求高的应用。
1.Android作为服务端
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<Button
android:id="@+id/starttcpServer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/tcplistener"
/>
<Button
android:id="@+id/startudpServer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/udplistener"
/>
</LinearLayout>
package com.example.socket;
import java.io.IOException;
import java.io.InputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Socket;
import java.net.ServerSocket;
import java.net.SocketException;
服务端的代码
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class ServerSocketTest extends Activity {
private Button starttcpButton;
private Button startudpButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_server_socket);
starttcpButton=(Button)findViewById(R.id.starttcpServer);
startudpButton=(Button)findViewById(R.id.startudpServer);
starttcpButton.setOnClickListener(new StartTCPServerListener());
startudpButton.setOnClickListener(new StartUDPServerListener());
}
class StartTCPServerListener implements OnClickListener{
@Override
public void onClick(View view) {
//创建TCP线程
TCPServerThread thread=new TCPServerThread();
//真正的启动线程
thread.start();
}
}
class StartUDPServerListener implements OnClickListener{
@Override
public void onClick(View view) {
//创建UDP线程
UDPServerThread thread=new UDPServerThread();
//真正的启动线程
thread.start();
}
}
class TCPServerThread extends Thread{
@Override
public void run() {
//创建服务器Socket对象
ServerSocket serverSocket=null;
try {
//监听4567这个端口
serverSocket=new ServerSocket(4567);
//接受用忽的输入流
Socket socket=serverSocket.accept();
//通过Socket得到输入流
InputStream inputStream=socket.getInputStream();
byte[] buffer=new byte[4*1024];
int temp=0;
//将输入流转成字符串进行处理
while((temp=inputStream.read(buffer))!=-1){
System.out.println(new String(buffer,0,temp));
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class UDPServerThread extends Thread{
@Override
public void run() {
try {
//得到UDP的服务端的Socket
DatagramSocket serversocket=new DatagramSocket(4568);
byte[] data=new byte[1024];
//创建一个空的数据包
DatagramPacket packet=new DatagramPacket(data,data.length);
//通过socket得到数据流,装入到DatagramPacket包中
serversocket.receive(packet);
//packet.getData()获取数据,
System.out.println(new String(packet.getData(),packet.getOffset(),packet.getLength()));
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
TCP客户端的代码如下:
package com.example.client;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class TCPClient {
/**
* @param args
* @throws UnknownHostException
* @throws IOException
*/
public static void main(String[] args) throws UnknownHostException, IOException {
Socket clientSocket=new Socket("192.168.1.8",4567);
InputStream inputStream=null;
OutputStream outputStream=null;
try {
inputStream=new FileInputStream("d://word.txt");
outputStream=clientSocket.getOutputStream();
byte[] data=new byte[1024];
int temp;
while((temp=inputStream.read(data))!=-1){
outputStream.write(data,0,temp);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
UDP的客户端的代码:
package com.example.client;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPClient {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
//创建客户端的Socket
DatagramSocket clientSocket=new DatagramSocket();
//创建一个IP的对象
InetAddress address=InetAddress.getByName("192.168.1.8");
String str="hello world";
byte[] buffer=str.getBytes();
//创建一个要发送数据的数据包
DatagramPacket pack=new DatagramPacket(buffer,buffer.length,address,4568);
//通过Socket将数据包发送出去
clientSocket.send(pack);
//将客户端的socket关闭
clientSocket.close();
}
}