android网络通信之socket编程

本文深入解析了Java中Socket编程中的TCP和UDP传输协议的区别及实现方式,通过具体实例展示了如何使用DatagramSocket和ServerSocket进行UDP通信,以及如何使用ServerSocket和InputStream进行TCP通信。
<span style="color:#333333;">/* 
 *  
 * android学习之 Socket编程 
 * UDP传输协议: 类似邮递,以数据包的形式发送。速度比较快,但目标是否正确接收,不负责验证。 
 * 以DatagramSocket/DatagramPackages处理。 
 * TCP传输协议:准确度较高,能够验证数据传输是否成功。 
 * 以ServerSocket/InputStream处理。 
 * 以TCP协议为例实现过程中遇到的问题 
 *  
 * 第一种测试:Tcp通信
 */  
/*服务器端*/
package com.linxiaosheng.javanet;
import java.io.IOException;
import java.io.InputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Enumeration;


import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;


import com.linxiaosheng.R;






public class ServerActivity extends Activity{
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.server);
button=(Button)findViewById(R.id.button1);
button.setOnClickListener(new ButtonClickListener());
}
class ButtonClickListener implements OnClickListener{


@Override
public void onClick(View v) {
// TODO Auto-generated method stub
System.out.println(GetHostIp());  
Thread thread=new Thread(new MyThread());
thread.start();
}

}
class MyThread implements Runnable{

@Override
public void run() {
// TODO Auto-generated method stub
ServerSocket serverSocket=null;
try {
serverSocket=new ServerSocket(8081);
Socket socket=serverSocket.accept();
InputStream inputStream=socket.getInputStream();
byte[] b=new byte[1024*4];
int num=0;
while((num=inputStream.read(b))!=-1){
System.out.println(new String(b,0,num));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}
}
//用于获取android机ip
public String GetHostIp() {  
 
        try {  
            for (Enumeration<NetworkInterface> en = NetworkInterface  
            .getNetworkInterfaces(); en.hasMoreElements();) {  
                NetworkInterface intf = en.nextElement();  
                for (Enumeration<InetAddress> ipAddr = intf.getInetAddresses(); ipAddr  
                .hasMoreElements();) {  
                    InetAddress inetAddress = ipAddr.nextElement();  
                    if (!inetAddress.isLoopbackAddress()) {  
                        return inetAddress.getHostAddress();  
                    }  
                }  
            }  
        }  catch (Exception e) {  
  
        }  
        return null;  
    }  

}</span>


package com.linxiaosheng.net;
/*客户端*/
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class TCP {
	public static void main(String args[]){
		Socket socket=null;
		InputStream is=null;
		OutputStream os=null;
		try {
			socket=new Socket("192.168.191.2", 8081);
			is=new FileInputStream(new File("./bin/noteSendList.jsp"));
			os=socket.getOutputStream();
			byte[] b=new byte[4*1024];
			int num=0;
			while((num=is.read(b))!=-1){
				os.write(b, 0, num);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				os.flush();
				os.close();
				is.close();
				socket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
}
/*第二种通信:UDP*/<span style="white-space:pre">																</span>          package com.linxiaosheng.javanet;

import java.io.IOException;
import java.io.InputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Enumeration;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.linxiaosheng.R;


/*服务器端*/
public class ServerActivity extends Activity{
	private Button button;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.server);
		button=(Button)findViewById(R.id.button1);
		button.setOnClickListener(new ButtonClickListener());
	}
	class ButtonClickListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			System.out.println(GetHostIp());  
			Thread thread=new Thread(new MyThread());
			thread.start();
		}
		
	}
	class MyThread implements Runnable{
		@Override
		public void run() {
			// TODO Auto-generated method stub
			DatagramSocket socket=null;
			try {
				socket=new DatagramSocket(8082);
				byte b[]=new byte[1024];
				DatagramPacket packet=new DatagramPacket(b, b.length);
				socket.receive(packet);
				System.out.println(packet.getLength());
				System.out.println(new String(b).toString());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				socket.close();
			}
			
			
			
		}
		
		
	}
	//用于获取android机ip
	public String GetHostIp() {  
		  
        try {  
            for (Enumeration<NetworkInterface> en = NetworkInterface  
            .getNetworkInterfaces(); en.hasMoreElements();) {  
                NetworkInterface intf = en.nextElement();  
                for (Enumeration<InetAddress> ipAddr = intf.getInetAddresses(); ipAddr  
                .hasMoreElements();) {  
                    InetAddress inetAddress = ipAddr.nextElement();  
                    if (!inetAddress.isLoopbackAddress()) {  
                        return inetAddress.getHostAddress();  
                    }  
                }  
            }  
        }  catch (Exception e) {  
  
        }  
        return null;  
    }  
	
}

/*客户端*/<span style="white-space:pre">																	</span>          package com.linxiaosheng.net;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDP {
	public static void main(String args[]){
		//创建一个inetaddress
		InetAddress laddr=null;
		//创建datagramsocket
		DatagramSocket datagramSocket=null;
		InputStream is=null;
		try {
			laddr = InetAddress.getByName("192.168.191.2");
			//这里不能默认绑定地址,否则会出现java.net.BindException: Cannot assign requested address的错误
			//目标地址要绑定在数据包
			datagramSocket=new DatagramSocket(8082);
			//读取文件
			is=new FileInputStream(new File("./bin/noteSendList.jsp"));
			byte[] b=new byte[1024];
			int len=0;
			while((len=is.read(b))!=-1){
				DatagramPacket packet=new DatagramPacket(b,len,laddr,8082);
				datagramSocket.send(packet);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				//关闭流
				is.close();
				//关闭socket
				datagramSocket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值