Eumenides-Z 2018-06-03 14:59 采纳率: 100%
浏览 1392
已结题

安卓与linux服务器进行socket通信错误:BrokenPipeError

我在linux上写了个python脚本,作为socket 服务器,安卓作为socket客户端,进行socket通信。linux的ip为192.168.80.100,socket端口为12345。
先启动socket服务器,再启动客户端,用客户端发送消息,服务器可以很好收到,但要对消息进行一段时间的处理,等到再发返回给客户端消息时,python就会出现:

 BrokenPipeError: [Errno 32] Broken pipe

这是安卓socket客户端代码:

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.view.View.OnClickListener;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import  java.net.Socket;

public class MainActivity extends AppCompatActivity {
    private TextView result = null;
    private static final String HOST = "192.168.80.100";
    private static final int PORT = 12345;
    private Socket socket = null;
    private BufferedReader bufferedReader = null;
    private PrintWriter printWriter = null;
    private String string = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final EditText eturl= findViewById(R.id.eturl);
        Button btn= findViewById(R.id.btn);

        initSocket();
        btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                String message;
                message = eturl.getText().toString();
                if (socket.isConnected()){
                    if (!socket.isOutputShutdown()){
                        Toast.makeText(MainActivity.this,"正在发送,请稍等……",Toast.LENGTH_LONG).show();
                        sendMsg(message);
                    }
                }
            }
        });
    }

    protected void sendMsg(final String message){
        new Thread(new Runnable() {
            @Override
            public void run() {
                if(socket.isConnected()){
                    if(!socket.isOutputShutdown()){
                        printWriter.println(message);
                    }
                }
            }
        }).start();
    }

    protected void initSocket(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    socket=new Socket(HOST,PORT);
                    bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    printWriter=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
                    if(socket!=null){
                        if (socket.isConnected()) {
                            if (!socket.isInputShutdown()) {
                                if ((string = bufferedReader.readLine()) != null) {
                                    Log.i("TAG","++"+string);
                                    string+="";
                                    handler.sendEmptyMessage(1);

                                } else {    //TODO
                                }
                            }
                        }
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }).start();
    }

    public Handler handler;

    {
        handler = new Handler() {
            public void handleMessage(Message msg) {
                if (msg.what == 1) {
                    Log.i("TAG", "--" + msg);
                    result.setText(new StringBuilder().append(result.getText().toString()).append(string).toString());
                }
            }
        };
    }

}

可能是安卓客户端在收到消息前已经关闭了socket,但要怎么解决呢,时间很急,求大神请教!不胜感激

  • 写回答

6条回答 默认 最新

  • devmiao 2018-06-03 15:53
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序