关于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" />