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