Android-打开数据套接字,连续写入文本视图(读取数据)

Android-打开数据套接字,连续写入文本视图(读取数据),android,sockets,tcp,client-server,Android,Sockets,Tcp,Client Server,我目前正在编写两个伟大的TCP/IP客户端示例。我的目标是创建一个简单的TCP/IP客户机,该客户机连接到服务器,一旦建立连接,就会使用从服务器传递的字符串不断更新TextView。如果用户按下一个按钮,客户端将向服务器发送一个停止命令,我最终希望将TextView扩展为一个带有转换字符串值的图形。我能够建立与服务器的连接,并从客户端发送stop命令,但到目前为止,我添加读取功能的尝试都没有成功,应用程序一启动就会崩溃 以下是我用于指导的示例的链接: 以下是我的主要活动中的代码: packa

我目前正在编写两个伟大的TCP/IP客户端示例。我的目标是创建一个简单的TCP/IP客户机,该客户机连接到服务器,一旦建立连接,就会使用从服务器传递的字符串不断更新TextView。如果用户按下一个按钮,客户端将向服务器发送一个停止命令,我最终希望将TextView扩展为一个带有转换字符串值的图形。我能够建立与服务器的连接,并从客户端发送stop命令,但到目前为止,我添加读取功能的尝试都没有成功,应用程序一启动就会崩溃

以下是我用于指导的示例的链接:

以下是我的主要活动中的代码:

package com.example.androidclient;

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
    TextView            textResponse;
    TextView            textIn;
    EditText            editTextAddress, editTextPort; 
    Button              buttonConnect, buttonStopTest, buttonDisconnect;
    Socket              socket              = null;
    DataInputStream     incomingString      = null;
    DataOutputStream    terminalLetter      = null;


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

        editTextAddress     = (EditText)findViewById(R.id.address);
        editTextPort        = (EditText)findViewById(R.id.port);
        buttonConnect       = (Button)findViewById(R.id.connect);
        buttonDisconnect    = (Button)findViewById(R.id.disconnect);
        buttonStopTest      = (Button)findViewById(R.id.stop_test);
        textResponse        = (TextView)findViewById(R.id.response);
        textIn              = (TextView)findViewById(R.id.text_in);

        buttonConnect.setOnClickListener(buttonConnectOnClickListener);

        buttonStopTest.setOnClickListener(buttonStopTestOnClickListener);

        buttonDisconnect.setOnClickListener(buttonDisconnectOnClickListener);
    }

    OnClickListener buttonConnectOnClickListener = new OnClickListener(){
        //setOnClickListener sets a callback to be invoked when the button is clicked
        @Override
        public void onClick(View arg0) {
            //Clicking button (Connect) calls a MyClientTask defined below. 
            MyClientTask myClientTask = new     
            MyClientTask(editTextAddress.getText().toString(),   
            Integer.parseInt(editTextPort.getText().toString()));
            myClientTask.execute();
        }
    };

    OnClickListener buttonStopTestOnClickListener = new OnClickListener(){
        //setOnClickListener sets a callback to be invoked when the button is clicked
        @Override
            public void onClick(View arg0) {
                try {
                    terminalLetter = new DataOutputStream(socket.getOutputStream());
                    terminalLetter.writeByte('b');
                    terminalLetter.writeByte('\n');
                    terminalLetter.close();
                    socket.close();
                } 
                catch (IOException e) {
                    System.err.println("Couldn't get I/O for the connection.");
                }
            }
    };

    OnClickListener buttonDisconnectOnClickListener = new OnClickListener(){
        //setOnClickListener sets a callback to be invoked when the button is clicked
        @Override
        public void onClick(View arg0) {
            try {
                socket.close();
            } 
            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    };


    public class MyClientTask extends AsyncTask<Void, Void, Void> {

        String IPaddress;
        int Port;
        String response = "";

        MyClientTask(String addr, int port){
        IPaddress = addr;
        Port = port;
        }

        @Override
        protected Void doInBackground(Void... arg0) {
        //Took socket declaration from here. 

        try {
            //Taking relevant parameters and applying them to socket
            socket = new Socket(IPaddress, Port);                
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024);
            byte[] buffer = new byte[1024];
            int bytesRead;

            InputStream inputStream = socket.getInputStream();

            incomingString = new DataInputStream(socket.getInputStream());
            textIn.setText(incomingString.readUTF());

            /*
             * notice:
             * inputStream.read() will block if no data return
             */
            while ((bytesRead = inputStream.read(buffer)) != -1){
                byteArrayOutputStream.write(buffer, 0, bytesRead);
                response += byteArrayOutputStream.toString("UTF-8");
            }
        } 
        catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            response = "UnknownHostException: " + e.toString();
        } 
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            response = "IOException: " + e.toString();
        }
        finally{
            if(socket != null){
                try {
                    socket.close();
                } 
                catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        textResponse.setText(response);
        super.onPostExecute(result);
    }

}

}
package com.example.androidclient;
导入java.io.ByteArrayOutputStream;
导入java.io.DataInputStream;
导入java.io.DataOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.net.Socket;
导入java.net.UnknownHostException;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.support.v7.app.ActionBarActivity;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.TextView;
公共类MainActivity扩展了ActionBarActivity{
文本视图文本响应;
TextView textIn;
EditText editTextAddress,editTextPort;
按钮连接、按钮选择、按钮断开连接;
套接字=空;
DataInputStream incomingString=null;
DataOutputStream terminalLetter=null;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
editTextAddress=(EditText)findViewById(R.id.address);
editTextPort=(EditText)findViewById(R.id.port);
buttonConnect=(按钮)findViewById(R.id.connect);
buttonDisconnect=(按钮)findViewById(R.id.disconnect);
buttonStopTest=(按钮)findViewById(R.id.stop\u测试);
textResponse=(TextView)findViewById(R.id.response);
textIn=(TextView)findViewById(R.id.text\u-in);
buttonConnect.setOnClickListener(buttonConnectOnClickListener);
ButtonSoptest.setOnClickListener(ButtonSopteStonClickListener);
buttonDisconnect.setOnClickListener(buttonDisconnectOnClickListener);
}
OnClickListener按钮onConnectionClickListener=新建OnClickListener(){
//setOnClickListener设置在单击按钮时调用的回调
@凌驾
公共void onClick(视图arg0){
//单击按钮(连接)调用下面定义的MyClientTask。
MyClientTask MyClientTask=新建
MyClientTask(editTextAddress.getText().toString(),
parseInt(editTextPort.getText().toString());
myClientTask.execute();
}
};
OnClickListener按钮选项ClickListener=新建OnClickListener(){
//setOnClickListener设置在单击按钮时调用的回调
@凌驾
公共void onClick(视图arg0){
试一试{
ternalletter=newdataoutputstream(socket.getOutputStream());
terminalLetter.writeByte('b');
terminalLetter.writeByte('\n');
terminalLetter.close();
socket.close();
} 
捕获(IOE异常){
System.err.println(“无法获取连接的I/O。”);
}
}
};
OnClickListener按钮DisconnectOnClickListener=新建OnClickListener(){
//setOnClickListener设置在单击按钮时调用的回调
@凌驾
公共void onClick(视图arg0){
试一试{
socket.close();
} 
捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
};
公共类MyClientTask扩展了AsyncTask{
字符串地址;
国际港口;
字符串响应=”;
MyClientTask(字符串地址,int端口){
IPaddress=addr;
端口=端口;
}
@凌驾
受保护的Void doInBackground(Void…arg0){
//从这里获取套接字声明。
试一试{
//获取相关参数并将其应用于插座
套接字=新套接字(IP地址、端口);
ByteArrayOutputStream ByteArrayOutputStream=新的ByteArrayOutputStream(1024);
字节[]缓冲区=新字节[1024];
int字节读取;
InputStream InputStream=socket.getInputStream();
incomingString=newDataInputStream(socket.getInputStream());
textIn.setText(incomingString.readUTF());
/*
*注意:
*如果没有数据返回,inputStream.read()将被阻止
*/
而((bytesRead=inputStream.read(缓冲区))!=-1){
写入(缓冲区,0,字节读取);
响应+=byteArrayOutputStream.toString(“UTF-8”);
}
} 
捕获(未知后异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
response=“UnknownHostException:”+e.toString();
} 
捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
response=“IOException:+e.toString();
}
最后{
if(套接字!=null){
试一试{
socket.close();