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

安卓与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 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项