当前位置: 首页 > 知识库问答 >
问题:

Android客户端套接字不向外部服务器发送或接收消息

龚弘业
2023-03-14

我对Android系统是新手。我有一个客户端类,我的主要活动引用。client类将客户端套接字连接到充当服务器的外部设备,但是它从不将我试图发送的消息发送到服务器。我知道这不是连接,因为在创建套接字时,我将setKeepAlive()设置为true,当我试图发送消息时不会引发异常,socket.isconnected()返回true,如果我试图在发送消息之前连接套接字,它会引发“已经连接”的异常。我已经尝试用各种拖车、换行符和传输结束符来结束字符串消息,我正在刷新dataoutpstream,并且我有

<uses-permission android:name="android.permission.INTERNET" />

许可。我没有得到任何错误消息,我只是没有看到Wireshark中发送的请求,我的代码如下:

public class Client {
private static final String TAG = "Client";
    private InputStream reader;
    private DataOutputStream writer;
    private Socket socket;
    private SocketAddress endpoint;
    private String sendMessage, recievedMessage, ip; // Request = iso8583.stISORequest;
    private int port, bytesRead = -1;
    private boolean messageSent = false,
            messageRecieved = false;
    ByteArrayOutputStream Bytearrayoutputstream;
    byte[]  response1 = new byte[ 512 ],
            response2 = new byte[ 512 ];

public Client(String ip, int port) throws Exception {

        setIp(ip);
        setPort(port);
        setSocket();
        setIO();
    }

    private void setIp(String hostIp) throws Exception {

        Pattern ipPattern = Pattern.compile("^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$");
        Matcher ipMatch = ipPattern.matcher(hostIp);

        if (!ipMatch.find()) {
            throw new Exception("invalid ip format");
        }

        else
            this.ip = hostIp;
    }

    private void setPort(int hostPort) throws Exception {

        Pattern portPattern = Pattern.compile("[0-9]{4}$"); // contains exactly 4 digits
        Matcher portMatch = portPattern.matcher(hostPort+"");

        if (!portMatch.find()) {
            throw new Exception("host port must be 4 digits from 0-9");
        }

        else
            this.port = hostPort;
    }

public void send() throws IOException {

        /* // connection test is not needed
        socket.connect(endpoint); // throws already connected exeption
        */

        this.messageRecieved = false; // toogle to false so transaction is not wrongfully assummed to have been recieved from pinpad

        byte [] request = this.sendMessage.getBytes(); //stRequest.getBytes();
        writer.write(request);
        writer.flush();

        this.messageSent = true;
    }

    public void recieveMessage() throws IOException, InterruptedException {

        this.messageSent = false; // toogle to false so the next transaction is not wrongfully assumed to have been sent to pinpad
        StringBuilder stringBuilder = new StringBuilder();

        while( ( bytesRead = reader.read( response1 ) ) != -1 )
        {
            Bytearrayoutputstream.write( response1, 0, bytesRead);
            stringBuilder.append(Bytearrayoutputstream);
        }

        if(bytesRead == -1){
            Log.i(TAG,"did not recieve");
            response1[0]    =   (byte)(0x20);
            response1[1]    =   (byte)(0x20);
        }

        int longitud    =   response1[1];
        response2       =   Arrays.copyOf(response1, longitud+2);
        Log.i(TAG, "Respuesta 1 SimHost: " +toHex(response2));

        this.recievedMessage = stringBuilder.toString();

        if(!(recievedMessage == null) || !recievedMessage.isEmpty())
            this.messageRecieved = true;
    }

private void setSocket() throws IOException {

        socket = new Socket();
        int timeout = 15000;
        endpoint = new InetSocketAddress(ip, port);
        socket.connect(endpoint, timeout);
        socket.setKeepAlive(true);

    }

    private  void setIO() {

        try {
            writer =  new DataOutputStream(socket.getOutputStream());
            Bytearrayoutputstream = new ByteArrayOutputStream();
            reader = socket.getInputStream();
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
}

public class MainActivity extends AppCompatActivity {

Button btn;
EditText Ip, hPort;

String sHostIP = "",
        iHostPort = "",
        response = "";

Client client;

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

    Ip = (EditText) findViewById(R.id.Ip);
    hPort = (EditText) findViewById(R.id.port);
    btn = (Button) findViewById(R.id.btn);

    btn.setOnClickListener(new View.OnClickListener() {
        @RequiresApi(api = Build.VERSION_CODES.O)
        @Override
        public void onClick(View v) {

            try {

                sHostIP = Ip.getText().toString();
                iHostPort = hPort.getText().toString();
      
                }

                logon();

            } catch (Exception e) {

                showToast(e.getMessage());
            }
        }
    });
}

private void showToast(String message) {

    Toast toast = Toast.makeText(getApplicationContext(),
            message,
            Toast.LENGTH_SHORT);

    toast.show();
}


@RequiresApi(api = Build.VERSION_CODES.O)
private void logon() throws Exception {

    String message = "this is a message\n";

    Thread emulator = new Thread(() -> {

        try{
            client = new Client(sHostIP, Integer.parseInt(iHostPort));
            client.setSendMessage(message);
            client.send();

            Thread.sleep(32000);

            if (client.getSendStatus() == true) {

                try {
                    client.recieveMessage();
                    Thread.sleep(32000); 
                }

                catch (Exception e){
                    response = "exception happened could not send message";
                }

                if(client.getRecievedStatus() == true && !client.getRecievedMessage().isEmpty())
                    response = client.getRecievedMessage();

                else
                    response = "did not recieve a response";
            } // if

            else
                response = "message was not sent";

            client.closeAll(); // finalize
        }

        catch (Exception e){
            e.printStackTrace();
        }

        runOnUiThread(()->{

            showToast(response);

        }); // inner thread

    }); // outer thread

    emulator.start();

} // logon

} // class

我看过类似的问题,我看到的所有答案都建议您以换行符、拖车、传输结束字符结束消息,使用同花顺,或者在清单中包括internet权限,我已经在做了。我用了PrintWriter,DataOutputStream,BufferedWriter,我把消息写成了字节,二进制字符串,UTF和ASCII字符数组,什么都没有,有人能告诉我我做错了什么吗?

共有1个答案

常朗
2023-03-14

问题是编码。这一行代码解决了它This.sendmessage.getBytes(StandardCharsets.iso_8859_1);

 类似资料:
  • 我有套接字服务器(java桌面应用程序)正在等待从java webapp(套接字客户端)连接。通信看起来还可以,我在客户端看到来自服务器的消息,但是当我发送消息时,我在服务器端没有收到任何消息。会有什么问题呢?当我检查服务器与telnet,一切正常。下面是我的代码: 服务器: 客户: 谢谢帮忙!

  • 我正在使用网络库和浏览器上的WebSocket实现一个套接字节点服务器。我正在成功使用telnet,但浏览器工作不正常。浏览器成功连接到套接字服务器并发送消息。我的服务器实现了一个事件,并立即触发和事件<代码>关闭,事件在断开连接时执行删除客户端(关闭浏览器,连接松动…)。 我不希望浏览器发送消息,然后断开连接。有人知道问题出在哪里吗? 套接字服务器 客户端(浏览器) 浏览器连接到服务器时的输出

  • 关于使用Java套接字的例子有上百万个——每个都是一样的!每一个都显示了一个正在创建的客户机套接字,一些文本正在发送,并且套接字已关闭。 我正在编写一些测试代码。我希望我的客户端循环并发送相当多的消息。每次关闭客户端套接字并重新创建似乎很傻,所以我想我只创建一个客户端套接字,循环循环并在同一个套接字上发送数据。问题是——我的服务器套接字不会打印出它收到的内容,直到客户端发送最后一条消息并且客户端套

  • 我也试图从Java服务器和Python客户机传输数据。我成功地将数据从客户端传输到服务器,但根本没有接收到数据。 在python客户机上,我有以下内容:(注意,这是在一个单独的线程中运行的) 如果这是成功的工作,输出将是客户端套接字值,等待服务器,然后得到一些数据。然而,它正陷入等待数据的困境。 这意味着套接字显然不是None,它正在等待缓冲区接收?我将接收缓冲区大小设置为1,以查看是否有任何数据

  • 我有一个Python服务器使用unix数据报套接字连接与一个C客户端通信。下面的代码设置一个套接字,然后从客户端发送和接收一条消息。这个脚本在python 2.7中工作,但是,当在python 3中测试它时,对recv()的调用会超时等待来自客户端的消息。然而,客户端确实从服务器接收消息而没有问题。我已经用3.5.2和3.7.1在两台不同的机器上测试过了,结果相同。 更新:我添加了一个ioloop

  • 我试图用java实现一个客户端服务器,在这里我读取客户端中的输入并在服务器中执行UperCase,然后返回客户端并打印UperCase。我使用ObjectOutputStream和ObjectInputStream进行读写,但是当我在客户机中键入一个msg时,程序会显示以下错误: Digite uma msg casa java.io.eofexception位于java.io.datainput