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