java - 用Socket二次发送消息失败,怎么办?
迷茫
迷茫 2017-04-18 09:45:39
0
2
573

本人对socket真的是小白级的,因为程序要求才硬着头皮写了个函数,结果第一次引用函数时,socket还能发送消息,但之后一直都被阻塞(?)了,直到我把整个程序关掉才发送出去。来这里看看有没有大侠可以解答一下我的问题。
以下是该函数代码:

        Status<Area> status=new Status<Area>();
       
        InetAddress addr;
        addr = InetAddress.getByName(HOST_NAME);
        Socket mSocket;
        mSocket = new Socket(addr, PORT_NO);
        out = mSocket.getOutputStream();
        mFlag = true;
        
        try
        {
                Area a = new Area();
                byte typeChosen=(byte) 0xff;
                byte [] output=new byte[10];
                //**中间省略output的内容**
                out.write(output);
                
                InputStream mInput = null;
                byte[] buffer = new byte[65536];
                int size = -1;
                boolean flag=true;
                while (flag) {
                    try {
                    // 此处为测试代码,测试代码每次运行能成功执行。
                    //所以问题应该不在parseFrontEndMsg函数中,所以此函数我就不放上来了。
//                        if(flag){
//                            byte[] realBuffer = new byte[18];
//                            realBuffer=new byte[] {0x00,0x04,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x09};
//                            parseFrontEndMsg(realBuffer,typeChosen);
//                            flag=false;
//                        }
                        if (size < 0) {
                            System.out.println("等待接收前置器发送信息....");
                        } else {
                            byte[] realBuffer = new byte[size];
                            System.arraycopy(buffer, 0, realBuffer, 0, size);
                            System.out.print("Message from front end: ");
                            printBytes(realBuffer);
                            parseFrontEndMsg(realBuffer,typeChosen);
                            flag=false;
                        }
                        //**问题可能出在这两句。(我猜
                        mInput = mSocket.getInputStream();
                        size = mInput.read(buffer);
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }            
                }
                    
//                mServerThread = new ServerThread();
//                mServerThread.init(addr,PORT_NO,typeChosen);
//                out.write(output);
//                mServerThread.start();
                
                FRAME_ID++;
            }
            status.setCode(1);
            status.setList(areaList);
            return status;

        }
         catch (Exception e) {
             e.printStackTrace();
            return new Status(0, e.toString());
        }
        finally 
        {
            System.out.println("close the Client socket and the io.");
            mSocket.close();
        }
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

membalas semua(2)
PHPzhong

Logik jenis apa yang ingin anda lengkapkan? Program anda kelihatan seperti ini:

  1. Sambung ke pelayan, kemudian hantar data, dan kemudian masukkan gelung while;

  2. menyekat bacaan Selepas membaca data, lakukan beberapa pemprosesan.
  3. flag

黄舟

Terdapat masalah dengan urutan pelayan anda Ia hanya menulis data sekali, jadi selepas pelanggan membaca data untuk kali pertama, bacaan berikutnya disekat.
Benang pelayan anda boleh ditukar seperti ini, gelung sementara, apabila data dibaca, tulis, jika tidak, ia akan disekat dalam bacaan.
Adalah disyorkan bahawa pelayan dan pelanggan diasingkan.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!