Socket的通信

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();
}


}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值