客户端:
package com.xinyintai.sendwordwall.tcp; import android.util.Log; import com.xinyintai.sendwordwall.model.FileMessage; import java.io.ObjectOutputStream; import java.net.Socket; /** * author : huyawen * e-mail : 1754397982@qq.com * time : 2019/09/11 * function: Socket 发送端 */ public class SocketClientThread extends Thread { public String TAG = "SocketClientThread"; String mIpAddress; int mClientPort; FileMessage fileMessage; public SocketClientThread(String mIpAddress, int mClientPort, FileMessage fileMessage) { this.mIpAddress = mIpAddress; this.mClientPort = mClientPort; this.fileMessage = fileMessage; } public void run() { try { //指定ip地址和端口号 Socket mSocket = new Socket(mIpAddress, mClientPort); if (mSocket != null) { //获取输出流、输入流 ObjectOutputStream out = new ObjectOutputStream(mSocket.getOutputStream()); // DataOutputStream out = new DataOutputStream(mSocket.getOutputStream()); out.writeObject(fileMessage); out.flush(); } } catch (Exception e) { e.printStackTrace(); Log.e(TAG, "connect exception"); return; } Log.e(TAG, "connect success"); } }
传递的对象需要实现序列化。我需要传递两张图片和两个文件的名字。
package com.xinyintai.sendwordwall.model; import java.io.Serializable; /** * author : huyawen * e-mail : 1754397982@qq.com * time : 2019/09/16 * function: 传递的信息 */ public class FileMessage implements Serializable { String fileNameLeft; String fileNameRight; byte[] leftBytes; byte[] rightBytes; public String getFileNameLeft() { return fileNameLeft; } public void setFileNameLeft(String fileNameLeft) { this.fileNameLeft = fileNameLeft; } public String getFileNameRight() { return fileNameRight; } public void setFileNameRight(String fileNameRight) { this.fileNameRight = fileNameRight; } public byte[] getLeftBytes() { return leftBytes; } public void setLeftBytes(byte[] leftBytes) { this.leftBytes = leftBytes; } public byte[] getRightBytes() { return rightBytes; } public void setRightBytes(byte[] rightBytes) { this.rightBytes = rightBytes; } }
activity调用的界面。
package com.xinyintai.sendwordwall.ui; import android.Manifest; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Process; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.lidroid.xutils.ViewUtils; import com.lidroid.xutils.view.annotation.ViewInject; import com.xinyintai.sendwordwall.R; import com.xinyintai.sendwordwall.model.FileMessage; import com.xinyintai.sendwordwall.tcp.SocketClientThread; import com.xinyintai.sendwordwall.utils.BitmapUtil; import com.xinyintai.sendwordwall.utils.FileUtils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { @ViewInject(R.id.bt) Button bt; @ViewInject(R.id.tv) TextView tv; public String TAG = "MainActivity"; public static int PERMISSION_REQ = 12340; private String[] mPermission = new String[]{ Manifest.permission.INTERNET, Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE }; private List<String> mRequestPermission = new ArrayList<String>(); FileInputStream inputStream = null; byte[] imageByte = null; String mIpAddress = "192.168.137.142"; int mClientPort = 9000; FileMessage fileMessage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ViewUtils.inject(this); fileMessage = new FileMessage(); final File file = new File(FileUtils.SDPATH + "fff.jpg"); try { inputStream = new FileInputStream(file); imageByte = BitmapUtil.readStream(inputStream); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { fileMessage.setFileNameLeft("fff.jpg"); fileMessage.setLeftBytes(imageByte); SocketClientThread thread = new SocketClientThread(mIpAddress, mClientPort, fileMessage); thread.start(); } }); initPermisson(); } Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 0) { } } }; private void initPermisson() { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { for (String one : mPermission) { if (PackageManager.PERMISSION_GRANTED != this.checkPermission(one, Process.myPid(), Process.myUid())) { mRequestPermission.add(one); } } if (!mRequestPermission.isEmpty()) { ActivityCompat.requestPermissions(MainActivity.this, mRequestPermission.toArray(new String[mRequestPermission.size()]), PERMISSION_REQ); return; } } } public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { // 版本兼容 if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.M) { return; } if (requestCode == PERMISSION_REQ) { for (int i = 0; i < grantResults.length; i++) { for (String one : mPermission) { if (permissions[i].equals(one) && grantResults[i] == PackageManager.PERMISSION_GRANTED) { mRequestPermission.remove(one); } } } return; } } }
socket接受端的代码:
package com.xinyintai.sendwordwall.tcp; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.Log; import com.xinyintai.sendwordwall.model.FileMessage; import com.xinyintai.sendwordwall.utils.BitmapUtil; import java.io.IOException; import java.io.ObjectInputStream; import java.net.ServerSocket; import java.net.Socket; /** * author : huyawen * e-mail : 1754397982@qq.com * time : 2019/09/10 * function: TCP 接受传递过来的图片 */ public class ReceiveSocket { private static ReceiveSocket instance; // 提供一个全局的静态方法 public static ReceiveSocket getReceiveSocket() { if (instance == null) { synchronized (ReceiveSocket.class) { if (instance == null) { instance = new ReceiveSocket(); } } } return instance; } public Bitmap getUploadImages() { Socket socket = null; Bitmap bitmap = null; try { ServerSocket mServerSocket = new ServerSocket(9000); socket = mServerSocket.accept(); if (socket != null) { ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream()); FileMessage fileMessage = (FileMessage) objectInputStream.readObject(); String name = fileMessage.getFileNameLeft(); byte[] buffer = fileMessage.getLeftBytes(); bitmap = BitmapFactory.decodeByteArray(buffer, 0, buffer.length); if (bitmap == null) { Log.e("ReceiveSocket", "服务器:bitmap为空"); } Log.e("ReceiveSocket", name + " buffer==" + buffer.length); BitmapUtil.saveFile(bitmap, name); Log.e("getUploadImages: ", "服务器:" + name + "接收成功"); } //接收完毕后,关闭socket socket.close(); mServerSocket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return bitmap; } }