socket中BufferedReader数据已经加载进去就是不在前台显示,中断服务器端才能在手机上显示

银河小分队 2017-01-03 09:15:17
package com.example.myxu;



import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

EditText ip=null;
EditText editText=null;
TextView text=null;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

ip=(EditText) findViewById(R.id.ip);
editText=(EditText) findViewById(R.id.editText);
text=(TextView) findViewById(R.id.textView2);

findViewById(R.id.connect).setOnClickListener(new OnClickListener() {

public void onClick(View v) {
conncet();

}
});


findViewById(R.id.send).setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
send();
}
});
}

//------------------------------

Socket socket=null;
BufferedReader reader=null;
BufferedWriter writer=null;
//获得链接
public void conncet(){

AsyncTask<Void, String, Void> read=new AsyncTask<Void, String, Void>(){

@Override
protected Void doInBackground(Void... arg0 ) {
try {
//建立连接
socket=new Socket(ip.getText().toString(),5000);
writer=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//作为onProgressUpdate()方法用
publishProgress("@success");
String line;

while ((line=reader.readLine())!=null) {
publishProgress(line);
}
} catch (IOException e) {
e.printStackTrace();
}
return null;

}

@Override
protected void onProgressUpdate(String... values) {
if (values[0].equals("@success")) {
Toast.makeText(MainActivity.this, "socket链接成功", Toast.LENGTH_SHORT).show();
}
//数据添加到手机上
text.append("服务器:"+values[0].toString()+"\n");
super.onProgressUpdate(values);
}
};

read.execute();
}

//发送内容
public void send(){
try {
writer.write(editText.getText().toString()+"\n");
text.append("我:"+editText.getText().toString()+"\n");
writer.flush();
//清空编辑框
editText.setText("");


} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
有错误吗?下面是日志:
?:??: W/?(?): logcat read failure: Connection refused
: E/(): Device disconnected: 1
reander中有数据,但是不在手机端显示,必须关闭服务端,然后一下都显示出来。用了clone()无效!
请大神教教我吧

...全文
177 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
银河小分队 2017-01-05
  • 打赏
  • 举报
回复
找到原因来了,ButteredRead.readLine()读取假死,数据在缓冲里。服务端有没发送 \N \R,发送了也识别不了。你有什么好主意解决吗?ButteredRead.read(),你会吗?能给我例子吗?最后要是字符串
银河小分队 2017-01-04
  • 打赏
  • 举报
回复
能告诉我为什么?asyncTask别的人都成,怎么就我不成?我的问题应该出在BufferedReader上,能读到数据,然后存在变量里,发回手机界面就是不行啊
严振杰 2017-01-04
  • 打赏
  • 举报
回复
初看起来你这个稳健性有点差了,建议你继承Thread或者实现Runnable接口来启动socket,然后在线程中保持OutPutStream对象,用来输出信息,然后把已经连接好的socket对象新起一个Runnable来接受输入:

        boolean flag = true;
        Socket socket = null;

        public AcceptThread(Socket socket) {
            this.socket = socket;
        }

        public void stop() {
            this.flag = false;
        }

        public void run() {
            DataInputStream input = new DataInputStream(socket.getInputStream());
            while (flag) {
                int count = 0;
                while (count == 0) {
                    count = input.available();
                }
                ...
               // 在这里用handler把接受到的信息发送出去,这是一个最简单的socket demo了。
        }
或者上面你先用Log打印出来看,如果成功了再用handler发送到主线程或者你的ui处。
严振杰 2017-01-04
  • 打赏
  • 举报
回复
引用 3 楼 qq_37176929 的回复:
能告诉我为什么?asyncTask别的人都成,怎么就我不成?我的问题应该出在BufferedReader上,能读到数据,然后存在变量里,发回手机界面就是不行啊
你这里是每读一行就发送到主线程了,是不是会存在覆盖的情况?当然这个不是重点,可以注意下。 然后不能显示的问题,你读出来消息后log一下,或者调试看,有没有走过去到读消息的那里,这个和服务器有关系的,是不是一连接上就立刻发消息?这几个一步步调试确定一下。
jinmaotowne 2017-01-03
  • 打赏
  • 举报
回复
Handler试试 初学者

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧