各位大神好,请教一个android socket的问题 5C

我目前遇到的问题是这样的:我想实现的功能是PC通过USB线连接到android手机,然后PC作为客户端,手机作为服务端,然后进行socket通信,我实现了一种方法,PC端使用
Java来写,已经成功了,现在我需要PC端需要python来写,就是说PC端用python实现
socket的客户端与手机进行USB通信;目前我也实验的差不多了,但是有个问题是:PC端能够连上服务端,但是数据似乎发布出去,安卓手机端一直卡在readUTF()的地方,但是安卓端可以给PC端回数据,PC端也能接收到android端的数据,附上代码,求大神?
PC python 客户端:(我PC端使用了adb forward端口转发)

import socket
import os
from time import sleep
from logging import shutdown
host='127.0.0.1'
port=9000

os.system("adb forward tcp:9000 tcp:9000")
sleep(3)

while 1:
    try:
        cmdstr=raw_input("please input cmd:")
        s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        s.connect((host,port))
        print "connect success"
        #s.sendall("asdafaf")
        #s.settimeout(10)

        req_msg = b'host:transport-any'
        s.sendall('%04x' % len(req_msg))
        s.sendall(req_msg)
        #s.settimeout(10)

        print "send ok"
        data=s.recv(1024)
        print data

    except:
        os.system('adb start-server')
        sleep(2)
        continue


    os.system("pause")

    #s.shutdown(2)
    #s.close()

android 服务端

package com.example.server_android;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.Toast;
import android.util.Log;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class MainActivity extends Activity {

    private static final String TAG = "ServerThread";

    ServerThread serverThread;

    Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            Toast.makeText(getApplicationContext(), msg.getData().getString("MSG", "Toast"), Toast.LENGTH_SHORT).show();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        serverThread = new ServerThread();
        serverThread.start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        serverThread.setIsLoop(false);
    }

    class ServerThread extends Thread {

        boolean isLoop = true;

        public void setIsLoop(boolean isLoop) {
            this.isLoop = isLoop;
        }

        @Override
        public void run() {
            Log.d(TAG, "running");

            ServerSocket serverSocket = null;
            try {
                serverSocket = new ServerSocket(9000);

                while (isLoop) {
                    Socket socket = serverSocket.accept();

                    Log.d(TAG, "accept");

                    DataInputStream inputStream = new DataInputStream(socket.getInputStream());
                    String msg = inputStream.readUTF();
                    Log.d(TAG, "Message:"+msg);


                    DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
                    outputStream.writeUTF("Receive OK");
                    outputStream.flush();

                    //jelly test begin

                    //outputStream.writeUTF("Receive OK\r");

                    //jelly test end

                    Message message = Message.obtain();
                    Bundle bundle = new Bundle();
                    bundle.putString("MSG", msg);
                    message.setData(bundle);
                    handler.sendMessage(message);

                    socket.close();
                }

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                Log.d(TAG, "destory");

                if (serverSocket != null) {
                    try {
                        serverSocket.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

}

3个回答

python 传递 的数据是UTF编码吗?会不会是编码问题?

u013896064
jelly_lzy 回复yztbydh: 发送数据的编码我也试过的,好像也不行
一年多之前 回复
yztbydh
Ung8023 回复u013896064: 不是python代码的编码格式,而是发送数据的编码
一年多之前 回复
qq_42312358
qq_42312358 dd
一年多之前 回复
u013896064
jelly_lzy 你的意思是在python代码开头加上这句吗:# -*- coding:utf-8 -*-,我试过了,加了也不行,很奇怪
一年多之前 回复

应该就是编码的问题,但是在python端我怎么修改都无法成功,android端不管怎样都接收不到,我最后找到一个方法是python端不用改,改了下android端的代码,如下,有遇到和我一样问题的朋友可以参考下

 package com.example.server_android;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.Toast;
import android.util.Log;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class MainActivity extends Activity {

    private static final String TAG = "ServerThread";

    ServerThread serverThread;

    Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            Toast.makeText(getApplicationContext(), msg.getData().getString("MSG", "Toast"), Toast.LENGTH_SHORT).show();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        serverThread = new ServerThread();
        serverThread.start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        serverThread.setIsLoop(false);
    }

    class ServerThread extends Thread {

        boolean isLoop = true;

        public void setIsLoop(boolean isLoop) {
            this.isLoop = isLoop;
        }

        @Override
        public void run() {
            Log.d(TAG, "running");

            ServerSocket serverSocket = null;
            try {
                serverSocket = new ServerSocket(9000);

                while (isLoop) {
                    Socket socket = serverSocket.accept();

                    Log.d(TAG, "accept");

                    DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
                    outputStream.writeUTF("Receive OK");
                    outputStream.flush();

                    InputStreamReader isr = new InputStreamReader(socket.getInputStream());
                    BufferedReader br = new BufferedReader(isr);

                    // 步骤3:通过输入流读取器对象 接收服务器发送过来的数据
                    String msg = br.readLine();
                    Log.d(TAG, "Message:"+msg);

                    //jelly test begin

                    //outputStream.writeUTF("Receive OK\r");

                    //jelly test end

                    Message message = Message.obtain();
                    Bundle bundle = new Bundle();
                    bundle.putString("MSG", msg);
                    message.setData(bundle);
                    handler.sendMessage(message);

                    socket.close();
                }

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                Log.d(TAG, "destory");

                if (serverSocket != null) {
                    try {
                        serverSocket.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

}

不需要,直接重置就好

u013896064
jelly_lzy 什么意思?直接重置
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!

相似问题

7
Android Socket 长连接
2
Android作为Socket通信客户端的代码分析
11
请教各位大神关于sql的问题
1
求各位大神帮我看下为什么我下载的android studio加入百分比依赖库有错误
1
matlab小白想请教一个也许各位大神看来很弱智的问题
0
数据库登录问题,请教各位大神
2
请教各位大神,我的程序执行的时候无法终止?
1
请教各位大神有没有js控件可以实现附图中表格的渲染效果
0
有没有大神专业会解决Android studio的问题的,搞了两天要疯了
1
Android socket连java服务器,Activity之间固定切换8次之后,链接中断
3
github上的一个项目,完全找不到运行的地方,也不懂怎么运行,各位大神有什么见解?
0
有没有前端layui的大神,请教一个关于form("clear")/upload的问题
2
苹果企业账号的描述文件过期后,APP闪退,请问各位大神有好的解决方案么?
1
请问各位大神如何使用vba代码将excel中不同sheet中的表格内容点都点使用邮件发送
0
用户点击关注列表时,关注商铺的头像用后台怎么能传给前端?用servlet写,拜托各位大神了。
0
Android虚拟机的问题,求大神指点
2
我是刚刚大一刚刚入门的学生,老师布置的作业搞不懂请教各位大神RecycleView中部分控件的显示和隐藏.如图
1
请教大神!!关于实现voip通信媒体代理服务器的问题
1
python关于类的,小白求救各位大神
1
求助各位大神~安装Gazebo时缺少share library的libtbb.so.2文件