[英]in socket programming inputstream.read() dosen't read in android
我正在用socket編寫簡單的聊天應用程序。 我正在連接到我的本地服務器,如果連接沒有問題,它在我的textview中顯示“已連接”,它顯示了這一點。
我的問題是,當我將兩個設備連接到我的服務器並嘗試使用其中一個發送按摩時,另一個不通過inputstream.read()獲得按摩並且它阻止了代碼。
這是我的代碼。 我很感激anybodys的幫助。
public class CommsThread extends Thread {<br>
static Context context;<br>
private Socket socket;
private InputStream inputStream;
private OutputStream outputStream;
public CommsThread(Socket sock) {
socket = sock;
InputStream tmpIn = null;
OutputStream tmpOut = null;
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) {
Log.d("SocketChat", e.getLocalizedMessage());
}
inputStream = tmpIn;
outputStream = tmpOut;
}
public void run() {
byte[] buffer = new byte[1024];
int bytes;
while (true) {
try {
bytes = inputStream.read(buffer);
MainActivity.UIupdater.obtainMessage(0, bytes, -1, buffer).sendToTarget();
} catch (IOException e) {
break;
}
}
}
public void write(byte[] bytes) {
try {
outputStream.write(bytes);
outputStream.flush();
} catch (IOException e) {
}
}
public void cancel() {
try {
socket.close();
} catch (IOException e) { }
}
}
public class MainActivity extends Activity {<br>
static final String NICKNAME = "Wei-Meng";<br>
InetAddress serverAddress;<br>
Socket socket;<br>
static TextView txtMessagesReceived;<br>
EditText txtMessage;<br>
CommsThread commsThread;<br>
static Handler UIupdater = new Handler() {
@Override
public void handleMessage(Message msg) {
int numOfBytesReceived = msg.arg1;
byte[] buffer = (byte[]) msg.obj;
String strReceived = new String(buffer);
strReceived = strReceived.substring(0, numOfBytesReceived);
txtMessagesReceived.setText(txtMessagesReceived.getText().toString() + strReceived);
}
};
private class CreateCommThreadTask extends AsyncTask<Void, Integer, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
serverAddress = InetAddress.getByName("172.20.10.3");
socket = new Socket(serverAddress, 80);
commsThread = new CommsThread(socket);
commsThread.start();
if (socket.isConnected())
txtMessagesReceived.setText("connected");
sendToServer(NICKNAME);
} catch (UnknownHostException e) {
Log.d("Sockets", e.getLocalizedMessage());
} catch (IOException e) {
Log.d("Sockets", e.getLocalizedMessage());
}
return null;
}
}
private class WriteToServerTask extends AsyncTask<byte[], Void, Void> {
protected Void doInBackground(byte[]...data) {
commsThread.write(data[0]);
return null;
}
}
private class CloseSocketTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
socket.close();
} catch (IOException e) {
Log.d("Sockets", e.getLocalizedMessage());
}
return null;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CommsThread.context = this;
txtMessage = (EditText) findViewById(R.id.txtMessage);
txtMessagesReceived = (TextView) findViewById(R.id.txtMessagesReceived);
}
public void onClickSend(View view) {
sendToServer(txtMessage.getText().toString());
}
private void sendToServer(String message) {
byte[] theByteArray = message.getBytes();
new WriteToServerTask().execute(theByteArray);
}
@Override
public void onResume() {
super.onResume();
new CreateCommThreadTask().execute();
}
@Override
public void onPause() {
super.onPause();
new CloseSocketTask().execute();
}
}
這是我的服務器代碼:
這樣做
String hostName = args[0];
int portNumber = Integer.parseInt(args[1]);
try (
Socket echoSocket = new Socket(hostName, portNumber);
PrintWriter out =
new PrintWriter(echoSocket.getOutputStream(), true);
BufferedReader in =
new BufferedReader(
new InputStreamReader(echoSocket.getInputStream()));
BufferedReader stdIn =
new BufferedReader(
new InputStreamReader(System.in))
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.