java - Socket 程序中的错误,发送空白消息并且每条消息之前都有一些奇怪的符号

标签 java android sockets websocket serversocket

我正在制作一个可用于向实时服务器发送消息的应用程序。 但是,每当创建新连接时,首先会发送一条空白消息,我不知道它是从哪里发送的。 每条消息前面都有一些奇怪的符号,我不知道它们来自哪里。

下面是我的代码 fragment 和图像

package com.example.suraj.client_phase_2;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {

    EditText etIpAddress;
    EditText etPortNumber;
    Button btnConnect;

    EditText etSendMessage;
    Button btnSend;

    String ipAddress;
    int portNumber = 0;
    int i =0;

    Thread m_objThreadClient;
    static Socket clientSocket;
    static ObjectOutputStream oos;


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

        // Fields Initialized
        etIpAddress = findViewById(R.id.etIpAddress);
        etPortNumber = findViewById(R.id.etPortNumber);
        btnConnect = findViewById(R.id.btnConnectDisconnect);

        etSendMessage = findViewById(R.id.etMessage);
        btnSend = findViewById(R.id.btnSend);

        // Disabling send button.
        btnSend.setEnabled(false);

        // Connection and disconnection is created
        try {
            btnConnect.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    if (i == 0) {
                        initialization();
                        connect();
                    } else {
                        disconnect();
                    }

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

        //Sending messages
        try {
        btnSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    String message = etSendMessage.getText().toString();
                    oos = new 
                  ObjectOutputStream(clientSocket.getOutputStream());
                    oos.writeObject(message);
                    //showToast(message);
                } catch (IOException e) {
                    e.printStackTrace();
                }

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

    }


    // Retrieving ipAddress and portNumber
    public void initialization(){

        try {
            ipAddress = etIpAddress.getText().toString();
            portNumber = Integer.valueOf(etPortNumber.getText().toString());
           // showToast(ipAddress+""+portNumber);

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



    // Creating Socket connection
    public void connect(){

        try {
            if (ipAddress == "" || portNumber == 0) {
                showToast("Please Enter IpAddress and Port Number ");
            } else {

                socketConnectDisconnect();
                btnConnect.setText("Disconnect");
                showToast("Connected");
                //Toast.makeText(this, "Connected" , 
                Toast.LENGTH_SHORT).show();

                //Enabling send button
                btnSend.setEnabled(true);
                etIpAddress.setEnabled(false);
                etPortNumber.setEnabled(false);
                i = 1;
            }
        }catch (Exception e){e.printStackTrace();}
    }



    // Disconnecting Socket connection
    private void disconnect() {
        try {
            socketConnectDisconnect();
            btnConnect.setText("Connect");
            showToast("Disconnected");
            //Toast.makeText(this, "Disconnected" , 
                 Toast.LENGTH_SHORT).show();
            //Disabling send button
            btnSend.setEnabled(false);
            etIpAddress.setEnabled(true);
            etPortNumber.setEnabled(true);
            i = 0;
        }catch (Exception e){e.printStackTrace();}
    }

    // establishing socket connection
    public void socketConnectDisconnect(){
        m_objThreadClient = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    if (i==0) {

                        clientSocket = new Socket(ipAddress, 
                           portNumber);//127.0.0.1

                    }else{
                        oos.writeObject("Disconnected");
                        oos.close();
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        });
        m_objThreadClient.start();

    }

    public void showToast(String text){

        Toast.makeText(this,text, Toast.LENGTH_SHORT).show();
    }



}



<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_marginStart="35dp"
        android:layout_marginTop="106dp"
        android:text="IP Address"
        android:textSize="15sp"
        android:textStyle="bold" />


    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignStart="@+id/textView"
        android:layout_alignParentTop="true"
        android:layout_marginStart="-4dp"
        android:layout_marginTop="197dp"
        android:fontFamily="sans-serif"
        android:text="Port Number"
        android:textSize="15sp"
        android:textStyle="bold" />


    <EditText
        android:id="@+id/etIpAddress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:layout_marginTop="89dp"
        android:layout_marginEnd="23dp"
        android:ems="10"
        android:hint="IP address"
        android:inputType="text" />



    <EditText
        android:id="@+id/etPortNumber"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignStart="@+id/etIpAddress"
        android:layout_alignParentTop="true"
        android:layout_marginStart="0dp"
        android:layout_marginTop="180dp"
        android:ems="10"
        android:hint="Port number"
        android:inputType="text" />


    <Button
        android:id="@+id/btnConnectDisconnect"
        android:layout_width="143dp"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="263dp"
        android:text="Connect" />


    <EditText
        android:id="@+id/etMessage"
        android:layout_width="232dp"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentBottom="true"
        android:layout_marginStart="22dp"
        android:layout_marginBottom="11dp"
        android:ems="10"
        android:hint="Start Typing........"
        android:inputType="text" />


    <Button
        android:id="@+id/btnSend"
        style="@style/Widget.Support.CoordinatorLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/etMessage"
        android:layout_alignParentEnd="true"
        android:layout_marginTop="1dp"
        android:layout_marginEnd="12dp"
        android:text="Send" />


</RelativeLayout>

Here's a image of sent messages to live server

最佳答案

您正在将字符串的序列化对象数据发送到套接字输出流;除非您确实打算这样做,如下所示更改您的代码:

public class MainActivity extends AppCompatActivity {
EditText etIpAddress;
EditText etPortNumber;
Button btnConnect;

EditText etSendMessage;
Button btnSend;

String ipAddress;
int portNumber = 0;
int i =0;

Thread m_objThreadClient;
static Socket clientSocket;
static OutputStream os;


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

    // Fields Initialized
    etIpAddress = findViewById(R.id.etIpAddress);
    etPortNumber = findViewById(R.id.etPortNumber);
    btnConnect = findViewById(R.id.btnConnectDisconnect);

    etSendMessage = findViewById(R.id.etMessage);
    btnSend = findViewById(R.id.btnSend);

    // Disabling send button.
    btnSend.setEnabled(false);

    // Connection and disconnection is created
    try {
        btnConnect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (i == 0) {
                    initialization();
                    connect();
                } else {
                    disconnect();
                }

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

    //Sending messages
    try {
        btnSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    String message = etSendMessage.getText().toString();
                    os = clientSocket.getOutputStream();
                    os.write(message.getBytes());
                    //showToast(message);
                } catch (IOException e) {
                    e.printStackTrace();
                }

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

}


// Retrieving ipAddress and portNumber
public void initialization(){

    try {
        ipAddress = etIpAddress.getText().toString();
        portNumber = Integer.valueOf(etPortNumber.getText().toString());
        // showToast(ipAddress+""+portNumber);

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



// Creating Socket connection
public void connect(){

    try {
        if (ipAddress == "" || portNumber == 0) {
            showToast("Please Enter IpAddress and Port Number ");
        } else {

            socketConnectDisconnect();
            btnConnect.setText("Disconnect");
            showToast("Connected");
            //Toast.makeText(this, "Connected" ,
            Toast.LENGTH_SHORT).show();

            //Enabling send button
            btnSend.setEnabled(true);
            etIpAddress.setEnabled(false);
            etPortNumber.setEnabled(false);
            i = 1;
        }
    }catch (Exception e){e.printStackTrace();}
}



// Disconnecting Socket connection
private void disconnect() {
    try {
        socketConnectDisconnect();
        btnConnect.setText("Connect");
        showToast("Disconnected");
        //Toast.makeText(this, "Disconnected" ,
        Toast.LENGTH_SHORT).show();
        //Disabling send button
        btnSend.setEnabled(false);
        etIpAddress.setEnabled(true);
        etPortNumber.setEnabled(true);
        i = 0;
    }catch (Exception e){e.printStackTrace();}
}

// establishing socket connection
public void socketConnectDisconnect(){
    m_objThreadClient = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                if (i==0) {

                    clientSocket = new Socket(ipAddress,
                            portNumber);//127.0.0.1

                }else{
                    os.write("Disconnected".getBytes());
                    os.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    });
    m_objThreadClient.start();

}

public void showToast(String text){

    Toast.makeText(this,text, Toast.LENGTH_SHORT).show();
}
}

下一行字符(\r\n)很可能是由服务器打印的。检查您在服务器上调用的打印接收缓冲区的方法。

关于java - Socket 程序中的错误,发送空白消息并且每条消息之前都有一些奇怪的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52685728/

相关文章:

android - 处理 CursorLoader 异常

c# - WebApi任务由于系统缺少足够的缓冲区空间或队列已满,无法对套接字执行操作

Java 套接字返回真

java - JPanel 中的图像没有立即出现

java - 从 getResource ("..."构造一个字符串会给出以 "file:/"开头的输出?

java - 如何通过 jdbc 在 PostgreSQL 中使用 Before Christ 日期编写时间戳?

c# - C#异步套接字客户端/服务器在服务器响应上挂起

java - fragment 布局问题

android - 在 Activity 的onCreate中获取国家名称

android - 由 Intent 启动时,MediaPlayer 不在后台播放