Android\java实现Socket传输对象

关于Socket介绍,请参考大佬博客https://blog.csdn.net/u013782203/article/details/51289803,写的很细致,非常佩服大神能研究的这么透彻。

ClientSendActivity.java

package wifi.transfer;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;  
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;  
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.SequenceInputStream;
import java.net.ServerSocket;
import java.net.Socket;   
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import wifi.localinfo.GetConnectIP;
import wifi.localinfo.GetLocalActivity;
import com.example.swissarmy.R;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.provider.MediaStore;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class ClientSendActivity extends Activity{  

	public static String ServerIP = "";//服务器地址   
	public static final int PORT = 8000;//服务器端口号    

	Button btn1, btn2, btn3, btn4, btn5, btn6, btn7;
	EditText et;
	TextView tv;
	
	public static File selectFile = null;
	
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.socket_client_send);
		
		btn1 = (Button) findViewById(R.id.client_send_file_button);
		btn4 = (Button) findViewById(R.id.client_select_file_button);
		btn6 = (Button) findViewById(R.id.client_send_message_button);
		tv = (TextView) findViewById(R.id.client_send_filepath_textview);
		
		et = (EditText) findViewById(R.id.client_send_message_edittext);
		
		TextView tvTitle =(TextView) findViewById(R.id.Titletext); 
		tvTitle.setText("客户端发送信息");
		ImageView back = (ImageView) findViewById(R.id.Titlehome);
		back.setOnClickListener(new ImageView.OnClickListener() {// 创建监听
			public void onClick(View v) {
				finish();
			}
		});
		
		btn1.setOnClickListener(new Button.OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				ServerIP = GetConnectIP.getOneIp();
				String filePath = selectFile.toString(); 
		        File tempFile =new File(filePath.trim());    
		        String fileName = tempFile.getName();  	        
				new ClientSendFileThread(ServerIP, fileName, filePath).start();
				Toast.makeText(getApplicationContext(), ServerIP, Toast.LENGTH_SHORT).show();
			}
		});	
	
		btn4.setOnClickListener(new Button.OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("*/*");//设置类型,我这里是任意类型,任意后缀的可以这样写。
                intent.addCategory(Intent.CATEGORY_OPENABLE);
                startActivityForResult(intent,1);
			}
		});	
		
		btn6.setOnClickListener(new Button.OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				String message = "Come From Client!  " + et.getText().toString() + "  Send Time:  " + df.format(new Date());

				ServerIP = GetConnectIP.getOneIp();
				new ClientSendMessageThread(ServerIP, message).start();
				Toast.makeText(ClientSendActivity.this, ServerIP, Toast.LENGTH_SHORT).show();
			}
		});	
	
	}
	
	@Override
	protected void onStart() {
		super.onStart();
	}	
	@Override
	protected void onStop() {
		super.onStop();
	}
	@SuppressWarnings("deprecation")
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	    if (resultCode == Activity.RESULT_OK) {//是否选择,没选择就不会继续
	        Uri uri = data.getData();//得到uri,后面就是将uri转化成file的过程。
	        String[] proj = {MediaStore.Images.Media.DATA};
	        Cursor actualimagecursor = managedQuery(uri, proj, null, null, null);
	        int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
	        actualimagecursor.moveToFirst();
	        String selectPath = actualimagecursor.getString(actual_image_column_index); 
	        selectFile = new File(selectPath);
	        tv.setText("文件路径:" + selectPath.toString());
	    }
	}
	
	private class ClientSendFileThread extends Thread{  
			      
		String serverAddress = null;
		String fileName = null;
		String fullPath = null;

		ClientSendFileThread(String ip, String fileName, String fullPath) {  
			this.serverAddress = ip;
			this.fileName = fileName;
			this.fullPath = fullPath;
		}  
		
		@Override  
		public void run() {  
			Socket socket = null;
			try
			{
				// 声明sock,其中参数为服务端的IP地址与自定义端口
				socket = new Socket(serverAddress, PORT);
				try
				{
		            FileInputStream fis = new FileInputStream(fullPath);
			           
		            //定义一个256字节的区域来保存文件信息。
		            byte[] b = fileName.getBytes();
		            byte[] fileInfo = Arrays.copyOf(b,256);  
		            
		            ByteArrayInputStream bais = new ByteArrayInputStream(fileInfo);		           
		            SequenceInputStream sis = new SequenceInputStream(bais,fis);	
		            
		            BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
		            byte[] sendByte = new byte[1024];
		            int length = 0; 
		            while((length = sis.read(sendByte))!=-1){
		                bos.write(sendByte,0,length);
		                bos.flush();
		            }
		            bos.close();
		            bos.flush();
		            sis.close();
		            fis.close();
		            bais.close();									   
				} catch (Exception e) {
		            e.printStackTrace();
		        } 
			} catch (IOException e){	
			}
		}  
	}

	private class ClientSendMessageThread extends Thread{  
		public String client_address;
		public String send_message;
		public ClientSendMessageThread(String ip, String message) {  
			super();
			this.client_address = ip;
			this.send_message = message;
		}  
		@Override  
		public void run() {  
			Socket sock = null;
			PrintWriter out;
			try
			{
				// 声明sock,其中参数为客户端的IP地址与自定义端口
				sock = new Socket(client_address, PORT);
				try
				{
					// 向客户端发送消息
					out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())), true);
					out.println(send_message);
					out.close();
					out.flush();
					sock.close();
								catch (Exception e)
				{
				}
			} catch (UnknownHostException e)
			{
				e.printStackTrace();
			} catch (IOException e)
			{
				e.printStackTrace();
			}	
		}  
	}
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
}

ServerReceiveActivity.java

package wifi.transfer;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;   
import java.io.InputStreamReader;
import java.net.ServerSocket;  
import java.net.Socket;  
import java.util.ArrayList;
import java.util.List;
import object.remark;
import com.example.swissarmy.R;
import database.operate.ClientInformationDatabase;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class ServerReceiveActivity extends Activity{  

	public static String ClientIP = "";
	public static final int PORT = 8000;//监听的端口号     

	Button btn2, btn7, btn8;
	TextView tv1, tv2, tv3;
	
	static ServerReceiveFileThread ReceiveFileService = null;
	static ServerReceiveMessageThread ReceiveMessageService = null;

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.socket_server_receive);
		
		btn2 = (Button) findViewById(R.id.server_receive_file_button);
		btn7 = (Button) findViewById(R.id.server_receive_message_button);
		btn8 = (Button) findViewById(R.id.server_closesocket_button);

		tv1 = (TextView) findViewById(R.id.server_receive_filename_textview);
		tv2 = (TextView) findViewById(R.id.server_receive_filepath_textview);
		tv3 = (TextView) findViewById(R.id.server_receive_message_textview);
		
		TextView tvTitle =(TextView) findViewById(R.id.Titletext); 
		tvTitle.setText("服务器接收信息");
		ImageView back = (ImageView) findViewById(R.id.Titlehome);
		back.setOnClickListener(new ImageView.OnClickListener() {// 创建监听
			public void onClick(View v) {
				finish();
			}
		});

		btn2.setOnClickListener(new Button.OnClickListener()
		{
			@Override
			public void onClick(View v)
			{	
				if (ReceiveFileService != null)
				{
					ReceiveFileService.close();
				}
				ReceiveFileService = new ServerReceiveFileThread();
				ReceiveFileService.start();
				//Toast.makeText(getApplicationContext(), "接收成功!",Toast.LENGTH_SHORT).show();
			}
		});
		btn7.setOnClickListener(new Button.OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				if (ReceiveMessageService != null)
				{
					ReceiveMessageService.close();
				}
				//service = new ServerReceiveHandlerThread(receiveFILEPATH);
				ReceiveMessageService = new ServerReceiveMessageThread();
				ReceiveMessageService.start();
				//Toast.makeText(getApplicationContext(), "接收成功!",Toast.LENGTH_SHORT).show();
			}
		});
		btn8.setOnClickListener(new Button.OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				if (ReceiveMessageService != null)
				{
					ReceiveMessageService.close();
				}
				if (ReceiveFileService != null)
				{
					ReceiveFileService.close();
				}
			}
		});
	}
	
	@Override
	protected void onStart() {
		super.onStart();
	}
	
	@Override
	protected void onStop() {
		super.onStop();
	}
	private class ServerReceiveFileThread extends Thread{    

		ServerSocket serverSocket = null;
		public boolean flag = true;
		String filePath = "/sdcard/Msec_Hub/";
		String fileName = "";
		String fullPath = "";

		@Override  
		public void run() {  
			try{  
				serverSocket = new ServerSocket(PORT);
				while(flag){  
					//读取客户端数据    
					Socket socket = serverSocket.accept();
					try {  							    			
						BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
						File file = new File(filePath);
						if (!file.exists()) {
							file.mkdirs();
						}						
						byte[] info = new byte[256];
						bis.read(info);
						fileName = new String(info).trim();
						fullPath = filePath + fileName;
						HandlerOfFile.sendEmptyMessage(1);

						BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fullPath));
						byte[] receiveByte = new byte[1024];
						int length = 0;
						while ((length = bis.read(receiveByte)) != -1) {
							bos.write(receiveByte, 0, length);
							bos.flush();
						}
						HandlerOfFile.sendEmptyMessage(2);
						bos.close();
						bos.flush();
						bis.close();
						socket.close();
					}catch (IOException e) {
						e.printStackTrace();
									}  
			}catch (Exception e){
				//	System.out.println(e.getMessage());
					}  
		public void close()
		{
			flag = false;
			if (serverSocket != null)
			{
				try
				{
					serverSocket.close();
				}
				catch (IOException e)
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}  

	private class ServerReceiveMessageThread extends Thread{  
		public ServerSocket serverSocket = null;
		public boolean flag = true;
		public String receiveMessage;

		@Override  
		public void run() {  
			try{  
				serverSocket = new ServerSocket(PORT);
				while(flag){  
					//读取服务器数据    
					Socket socket = serverSocket.accept();
					try{
						BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
						receiveMessage = in.readLine();
						HandlerOfMessage.sendEmptyMessage(0);
						in.close();
					}catch (Exception e)
					{
						e.printStackTrace();
					}finally
					{
						socket.close();
					}	
				}  
			}catch (Exception e)
			{
				//	System.out.println(e.getMessage());
					}  
		public void close()
		{
			flag = false;
			if (serverSocket != null)
			{
				try{
					serverSocket.close();
				}
				catch (IOException e){
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}  
	
	private Handler HandlerOfMessage = new Handler()
	{
		public void handleMessage(android.os.Message msg)
		{
			switch (msg.what)
			{
			// 接收的内容
			case 0:
				tv3.setText("消息内容:" + ReceiveMessageService.receiveMessage);
				break;			
			default:
				break;
			}
		};
	};
	
	private Handler HandlerOfFile = new Handler()
	{
		public void handleMessage(android.os.Message msg)
		{
			switch (msg.what)
			{
			case 1:
				tv1.setText("文件名字:" + ReceiveFileService.fileName);
				break;
			case 2:
				tv2.setText("文件路径:" + ReceiveFileService.fullPath);
				break;				
			default:
				break;
			}
		};
	};

	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
}

socket权限

 
 

    <uses-permission android:name="android.permission.INTERNET" />     <uses-permission android:name="android.permission.GET_TASKS" />

如有问题,欢迎指出

  <uses-permission android:name="android.permission.INTERNET" />

    <uses-permission android:name="android.permission.GET_TASKS" />

猜你喜欢

转载自blog.csdn.net/cugzhaolc/article/details/80447758