Android 如何使用TCP套接字传输位图
我有一个服务器/客户端应用程序,我想在其中发送和显示客户端上服务器的屏幕截图。有人能帮我吗。谢谢 代码如下 服务器端Android 如何使用TCP套接字传输位图,android,client-server,tcpclient,tcpserver,tcpsocket,Android,Client Server,Tcpclient,Tcpserver,Tcpsocket,我有一个服务器/客户端应用程序,我想在其中发送和显示客户端上服务器的屏幕截图。有人能帮我吗。谢谢 代码如下 服务器端 public class ServerActivity extends Activity { private TextView serverStatus; RelativeLayout mainLayout; // default ip public static String SERVERIP = "10.0.2.15"; // designate a port pub
public class ServerActivity extends Activity {
private TextView serverStatus;
RelativeLayout mainLayout;
// default ip
public static String SERVERIP = "10.0.2.15";
// designate a port
public static final int SERVERPORT = 8080;
private Handler handler = new Handler();
private ServerSocket serverSocket;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.server);
serverStatus = (TextView) findViewById(R.id.server_status);
SERVERIP = getLocalIpAddress();
Thread fst = new Thread(new ServerThread());
fst.start();
}
public class ServerThread implements Runnable {
public void run() {
try {
if (SERVERIP != null) {
handler.post(new Runnable() {
@Override
public void run() {
serverStatus.setText("Listening on IP: " + SERVERIP);
}
});
serverSocket = new ServerSocket(SERVERPORT);
while (true) {
// listen for incoming clients
Socket client = serverSocket.accept();
handler.post(new Runnable() {
@Override
public void run() {
serverStatus.setText("Connected");
mainLayout = (RelativeLayout)findViewById(R.id.screen);
ImageView iv =(ImageView)findViewById(R.id.iv);
File root = Environment.getExternalStorageDirectory();
File file = new File(root,"androidlife.jpg");
Bitmap b = Bitmap.createBitmap(mainLayout.getWidth(), mainLayout
.getHeight(), Bitmap.Config.ARGB_8888);
iv.setImageBitmap(b);
Canvas c = new Canvas(b);
mainLayout.draw(c);
//serverStatus.setText("Screenshot is displaying");
}
});
try {
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
//receive a message
String incomingMsg = in.readLine() + System.getProperty("line.separator");
Log.i("TcpServer", "received: " + incomingMsg);
serverStatus.setText("received: " + incomingMsg);
//send a message
String outgoingMsg = "goodbye from port " + SERVERPORT + System.getProperty("line.separator");
out.write(outgoingMsg);
//out.flush();
Log.i("TcpServer", "sent: " + outgoingMsg);
serverStatus.setText("sent: " + outgoingMsg);
//while ((line = in.readLine()) != null)
handler.post(new Runnable() {
@Override
public void run() {
}
});
// }
break;
}
catch (Exception e) {
handler.post(new Runnable() {
@Override
public void run() {
serverStatus.setText("Oops. Connection interrupted. Please reconnect your phones.");
}
});
e.printStackTrace();
}
}
} else {
handler.post(new Runnable() {
@Override
public void run() {
serverStatus.setText("Couldn't detect internet connection.");
}
});
}
} catch (Exception e) {
handler.post(new Runnable() {
@Override
public void run() {
serverStatus.setText("Error");
}
});
e.printStackTrace();
}
}
}
// gets the ip address of your phone's network
private String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); }
}
}
} catch (SocketException ex) {
Log.e("ServerActivity", ex.toString());
}
return null;
}
@Override
protected void onStop() {
super.onStop();
try {
// make sure you close the socket upon exiting
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我在你的代码中没有看到你试图发送图像位图或屏幕截图的地方!!并且不能通过套接字发送位图。创建位图b后,应在发送方添加此项,以从位图中创建字节数组:
ByteArrayOutputStream stream = new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
在服务器端接收器中,单击bytearray,然后按以下方式重新创建位图:
Bitmap breceived = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
我在你的代码中没有看到你试图发送图像位图或屏幕截图的地方!!并且不能通过套接字发送位图。创建位图b后,应在发送方添加此项,以从位图中创建字节数组:
ByteArrayOutputStream stream = new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
在服务器端接收器中,单击bytearray,然后按以下方式重新创建位图:
Bitmap breceived = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
你需要更具体一些。是否有错误,或者您不知道如何完成某些任务?如果您能提供更多关于该问题的详细信息,我们将乐于提供帮助。您需要更具体。是否有错误,或者您不知道如何完成某些任务?如果您提供有关该问题的更多详细信息,我们将很乐意提供帮助。您不应该首先发送从位图创建的byteArray的长度吗?您不应该首先发送从位图创建的byteArray的长度吗?