私はこれに関連するすべての投稿をチェックしましたが、私の問題に答えるものはありません。とにかく、私はソケットを使って簡単なチャットサーバー - クライアントアプリケーションを作っています。下のコードでは、サーバーは常にクライアントにデータを送信できますが、クライアントがサーバーに送信すると、クライアントにデータを送信しない限りサーバーのUIに表示されません。たとえば、次のクライアントの状況にAndroidサーバーソケットがすぐに聴いていない
サーバー:
Serverは ""
サーバーが表示さ ""
クライアントは、クライアントのUIで "A" を表示する ""
サーバーUIのクライアントrecievesを送信
サーバは、クライアントが "B"
をrecieves
ServerのUIに "B"
サーバーが表示さ "B" を送信しますクライアントは、 "C"
クライアント
クライアントUIの "C" を表示recievesクライアントUIでクライアントディスプレイ "B"
サーバーは、サーバーUIで "C"
サーバー表示 "C" を送信
サーバーの状況にクライアント:
クライアントが
Serverは何もを受けていないクライアントのUIで ""
クライアントディスプレイ "A" を送信します210 Serverは断絶がサーバーUI
で以前
サーバーディスプレイ "A" から "A" //を受け
ServerのUIに "B"
サーバーディスプレイ "B" を送信サーバーUI
サーバーに何も表示されませんクライアントが
クライアントが
クライアントが
クライアントが "W"を送信し、クライアントUIで "Q" を表示する "Q" を送信サーバーのUIに "B"
クライアントディスプレイ "B" を受信しますクライアントのUIで クライアントディスプレイ "W"
クライアントが
Serverは、 "Q"、 "W"、または "E"
サーバーが送信する」のどれを受けていないクライアントのUIで "E"
クライアントディスプレイ "E" を送信します『サーバーのUIで
クライアントが受け取る『P 『サーバーUIで
サーバーが表示さ』」
サーバーディスプレイ』P EクライアントUIに
をP』
クライアントのディスプレイ 『P』をあなたがこれを引き起こしているどう思いますか?私が望むのは、何度もクライアントがデータを送信したときに、サーバーが自分の現在の状況を何もクリックすることなく受信したときだけです。クライアントはサーバーのデータを正常に受信します。どんな答え
Client.java
//imports...
public class RawClient extends Activity {
int portNo = 8080;
//globals..
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_client);
editTextAddress = (EditText) findViewById(R.id.address);
buttonConnect = (Button) findViewById(R.id.connect);
textResponse = (TextView) findViewById(R.id.response);
buttonConnect.setOnClickListener(buttonConnectOnClickListener);
}
View.OnClickListener buttonConnectOnClickListener =
new View.OnClickListener() {
@Override
public void onClick(View arg0) {
MyClientTask myClientTask = new MyClientTask(
editTextAddress.getText().toString(),
portNo);
myClientTask.execute();
}
};
public class MyClientTask extends AsyncTask<Void, Void, Void> {
String dstAddress;
int dstPort;
String response = "";
MyClientTask(String addr, int port) {
dstAddress = addr;
dstPort = port;
}
@Override
protected Void doInBackground(Void... arg0) {
Socket socket = null;
try {
socket = new Socket(dstAddress, dstPort);
ByteArrayOutputStream byteArrayOutputStream =
new ByteArrayOutputStream(1024);
byte[] buffer = new byte[1024];
int bytesRead;
InputStream inputStream = socket.getInputStream();
/*
* 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) {
super.onPostExecute(result);
textResponse.setText("Connected");
textResponse.setTextColor(Color.parseColor("#2eb82e"));
buttonConnect.setEnabled(false);
//reinstantiated thread to recieve messages from server/send message to server
sendData = new ClientPassData(
editTextAddress.getText().toString(),
portNo);
sendData.execute();
}
}
//class called to send data..
public class ClientPassData extends AsyncTask<Void, Void, Void> {
String dstAddress;
int dstPort;
String getResponse = "";
ClientPassData(String addr, int port) {
dstAddress = addr;
dstPort = port;
}
@Override
protected Void doInBackground(Void... arg0) {
Socket socket = null;
try {
socket = new Socket(dstAddress, dstPort);
//send data to client
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
.getOutputStream())), true);
out.println("" + my_answer);
out.flush();
ByteArrayOutputStream byteArrayOutputStream =
new ByteArrayOutputStream(1024);
byte[] buffer = new byte[1024];
int bytesRead;
InputStream inputStream = socket.getInputStream();
/*
* notice:
* inputStream.read() will block if no data return
*/
//recieve data from server
if (inputStream == null) {
}
while ((bytesRead = inputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, bytesRead);
getResponse += byteArrayOutputStream.toString("UTF-8");
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
getResponse = "UnknownHostException: " + e.toString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
getResponse = "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) {
super.onPostExecute(result);
//do anything with recieved message
//reinstantiate itself to continue listening to server
sendData = new ClientPassData(
editTextAddress.getText().toString(),
portNo);
sendData.execute();
// }
}
}
public void cl_send(View view) {
if(cl_input.getText().toString().length() <= 0){
Toast t = Toast.makeText(getApplicationContext(), "Cannot Send Empty String", Toast.LENGTH_SHORT);
t.show();
} else {
sendData = new ClientPassData(
editTextAddress.getText().toString(),
portNo);
//set data to send to server here
//send!
sendData.execute();
}
}
}
サーバーをありがとう。java
//imports..
public class RawServer extends Activity {
//globals..
TextView info, infoip, serverEnemScore, txtServMyScore;
String message = "";
ServerSocket serverSocket;
String lastAnswer = "";
Socket globalSocket;
Thread socketServerThread;
int round = 1;
int play = 0; //counter to know how many iterations of the game had happened.
int servMyScore = 0; //variable that holds my score...
int servEnemyScore = 0;
String passValue = "", ser_myAnswer = "";
SocketServerReplyThread servePass;
String lineChat = null; //String that will hold message of Client from InputStream
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_server);
initiailize();
infoip = (TextView) findViewById(R.id.infoip);
infoip.setText(getIpAddress());
socketServerThread = new Thread(new SocketServerThread());
socketServerThread.start(); //starts listening to connecting clients
}
private String getIpAddress() {
String ip = "";
try {
Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface
.getNetworkInterfaces();
while (enumNetworkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = enumNetworkInterfaces
.nextElement();
Enumeration<InetAddress> enumInetAddress = networkInterface
.getInetAddresses();
while (enumInetAddress.hasMoreElements()) {
InetAddress inetAddress = enumInetAddress.nextElement();
if (inetAddress.isSiteLocalAddress()) {
ip += "SiteLocalAddress: "
+ inetAddress.getHostAddress() + "\n";
}
}
}
} catch (SocketException e) {
e.printStackTrace();
ip += "Something Wrong! " + e.toString() + "\n";
}
return ip;
} //end of getIpAddress
public void send(View v){
servePass = new SocketServerReplyThread(globalSocket, score);
ser_myAnswer = input.getText().toString();
rowMessages.add(new RowMessage(me, ser_myAnswer)); //add to arraylist
adapter.notifyDataSetChanged(); //updates the adapter na naay nadungag na data sa arraylist
scrollMyListViewToBottom();
input.setText("");
servePass.run();
}
private class SocketServerThread extends Thread {
static final int SocketServerPORT = 8080;
int count = 0;
boolean flag = false;
@Override
public void run() {
try {
serverSocket = new ServerSocket(SocketServerPORT);
while (true) {
Socket socket = serverSocket.accept();
globalSocket = socket;
final SocketServerReplyThread socketServerReplyThread = new SocketServerReplyThread(
socket, count);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
lineChat = in.readLine();
RawServer.this.runOnUiThread(new Runnable() {
@Override
public void run() {
if(!lineChat.equals(lastAnswer) && lineChat.length() > 0){
lastAnswer = lineChat;
//display answer from client here
}
}
});
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private class SocketServerReplyThread extends Thread {
private Socket hostThreadSocket;
int cnt;
SocketServerReplyThread(Socket socket, int c) {
hostThreadSocket = socket;
cnt = c;
}
@Override
public void run() {
OutputStream outputStream;
String msgReply;
try {
//send data to client
outputStream = hostThreadSocket.getOutputStream();
PrintStream printStream = new PrintStream(outputStream);
printStream.print(msgReply);
printStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
message += "Something wrong! " + e.toString() + "\n";
}
}
}
}