手机端用socket通信接收服务器端的发送的数据,利用handler更新在界面,但现在显示不了数据,不知道代码哪里出问题了。

Zzzfan 发布于 2015/06/26 16:21
阅读 483
收藏 0

     服务器端用java语言,功能是键盘录入数据,然后用socket发送给安卓手机端。客户端是android程序,当运行服务器键盘输入一个数据后,在手机程序上显示不了,不知道问题出在哪里。希望各位精通这方面的给解答一下代码哪里出现问题了。

        服务器端的java代码

public class chutian {
         public static void main(String[] args) throws IOException
        {

                 ServerSocket ss=new ServerSocket(30000);
                 Socket s=ss.accept();   //阻塞式
                 BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
                 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter
                                     (s.getOutputStream()));
                 String line=null;
                 while ((line=br.readLine())!=null){       //阻塞式
                          if ("over".equals(line)) {
                          break;
                          }
                          bw.write(line);
                          bw.newLine();
                          bw.flush();
                }
                s.close();
         }
}
         下面是androidDemo

public class MainActivity extends Activity {
           EditText show;
           @Override
           protected void onCreate(Bundle savedInstanceState) {
                   super.onCreate(savedInstanceState);
                   setContentView(R.layout.activity_main);
                   show=(EditText) findViewById(R.id.et1);
                   final Handler handler=new Handler()
                   {
                          public void handleMessage(Message msg)
                          {
                                  if (msg.what==0x123) {
                                         show.setText(msg.obj.toString());
                                  }
                          }
                  };
                  new Thread()
                  {
                          public void run()
                          {

                               try{

                                        Message msg=new Message();
                                        msg.what=0x123;
                                        Socket socket = new Socket("192.168.0.104",30000);
                                        BufferedReader br = new BufferedReader(
                                                       new InputStreamReader(socket.getInputStream()));
                                        String line=null;
                                        while ((line=br.readLine())!=null) {
                                                msg.obj=line;
                                                handler.sendMessage(msg);
                                        } 
                                        br.close();
                                        socket.close();
                                        }catch(IOException d){
                                               d.printStackTrace();
                                        } 
                               }
                     }.start();
           }
}




加载中
0
itkang
itkang
一步步排错,先保证客户端收到了消息,在确定为什么没有显示出来
0
hibegin
hibegin

应该readLine() 的问题,请参照JDK文档,readLine() 需要收到的数据有 \n 这样的行结束标示符才会结束这次读取的。

给你贴个以前会的问题供参考,

http://www.oschina.net/question/1998885_231374

Z
Zzzfan
回复 @wzfz : 额,我这样问一下吧,注释掉while后,把handler.sendMessage(msg)放在line=br.readLine()后面,然后我发送一个消息,显示没问题。这说明readLine()读到数据了,因为如果没有读到数据,这里是阻塞的,就不会接着执行下面发送消息的语句了。还有你说的那个dataSize的方法,能不能帮我写进while里面,谢谢了!
hibegin
hibegin
回复 @Zzzfan : 这样描述的话就说明while(condition) 这里的条件不满足撒,就导致没有进去呀。 就是本质问题还是 readLine() 的 \n 没有读取到。 还就是为撒一定要使用 readLine() 呢(手动在msg后面加个\n 然后再发送就能处理了)。 dataSize(int)+data 这样我感觉时最合适的了额。
Z
Zzzfan
如果我把while注释掉后,然后把handler里面的show方法改为显示一句字符串后,把handler.sendMessage(msg)从while拿出来放外面,然后服务器端发数据,字符串可以显示出来,是不是while循环里面有问题,但又感觉语句正常。
0
hibegin
hibegin
回复 @Zzzfan : 本质原因还是这个吧。 SocketServer 启动后就等待被连接,但是这里你先就使用了readLine() 进行读取数据了。这里意味这客户端需要先发送点数据到服务端,你再Client的代码没有任何的任何发送消息的代码导致的。 就是说。client端在连接成功后得到OutputStream.wirte("\n".getBytes[]) 这样服务端就不会堵塞了,当Handler 结束后也这样来一下就可以了。
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部