Android Socket客户端发送数据服务端无响应,但可以连接成功并接收服务端的消息求助大佬!

Poulyield 2018-03-07 05:37:06
大体就是想做一个demo,客户端和服务端在同一app不同进程上,客户端和服务端连接成功,客户端接收服务端的一条初始信息并显示在TextView(mMessageTextView)上,
然后客户端每点击按钮(mSendButton)发送一个信息,服务端都会随机回复一句信息,并显示在TextView(mMessageTextView)上

客户端代码:
public class TCPClientActivity extends Activity implements View.OnClickListener {

private static final int MESSAGE_RECEIVE_NEW_MSG = 1;
private static final int MESSAGE_SOCKET_CONNECTED = 2;

private Button mSendButton;
private TextView mMessageTextView;
private EditText mMessageEditText;

private PrintWriter mPrintWriter;
private Socket mClientSocket;

@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler(){

@Override
public void handleMessage(Message msg) {
switch(msg.what)
{
case MESSAGE_RECEIVE_NEW_MSG:
mMessageTextView.setText(mMessageTextView.getText() + (String)msg.obj);
break;
case MESSAGE_SOCKET_CONNECTED:
mSendButton.setEnabled(true);
break;
default:
break;

}
}
};

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

mMessageTextView = (TextView)findViewById(R.id.msg_container);
mMessageEditText = (EditText)findViewById(R.id.msg);
mSendButton = (Button)findViewById(R.id.send);
mSendButton.setOnClickListener(this);

Intent service = new Intent(this,TCPServerService.class);
startService(service);

new Thread(){
@Override
public void run() {
connectTCPServer();
}
}.start();

}

@Override
protected void onDestroy() {
if(mClientSocket != null)
{
try{
mClientSocket.shutdownInput();
mClientSocket.close();
}catch(IOException e)
{
e.printStackTrace();
}
}

super.onDestroy();
}

@Override
public void onClick(View v) {

if(v == mSendButton)
{
final String msg = mMessageEditText.getText().toString();
if(!TextUtils.isEmpty(msg) && mPrintWriter != null)
{
mPrintWriter.println(msg);
mMessageEditText.setText("");
String time = formatDateTime(System.currentTimeMillis());
final String showedMsg = "self " + time + ":" + msg + "\n";
mMessageTextView.setText(mMessageTextView.getText() + showedMsg);
}


}

}

@SuppressLint("SimpleDateFormat")
private String formatDateTime(Long time)
{
return new SimpleDateFormat("(hh:mm:ss)").format(new Date(time));
}

private void connectTCPServer(){

Socket socket = null;
while(socket == null){
try {
socket = new Socket("localhost", 8688);
mClientSocket = socket;
mPrintWriter = new PrintWriter( new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
mHandler.sendEmptyMessage(MESSAGE_SOCKET_CONNECTED);
System.out.println("connect server success");
}catch(IOException e)
{
SystemClock.sleep(1000);
System.out.println("connect tcp server failed, retry...");
}
}

try{
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(!TCPClientActivity.this.isFinishing() && !socket.isClosed() && socket.isConnected())
{
String msg = br.readLine();
System.out.println("receive :" + msg);
if(msg != null) {
String time = formatDateTime(SystemClock.currentThreadTimeMillis());
final String showedMsg = "server " + time + ":" + msg + "\n";
mHandler.obtainMessage(MESSAGE_RECEIVE_NEW_MSG,showedMsg).sendToTarget();

}
}

System.out.println("quit...");
MyUtils.close(mPrintWriter);
MyUtils.close(br);
socket.close();
}catch(IOException e)
{
e.printStackTrace();
}

}

}


服务端代码:
public class TCPServerService extends Service
{
private boolean mIsServiceDestoryed = false;
private String[] mDefinedMessages = new String[]{
"你好啊,哈哈",
"请问你叫什么名字啊?",
"今天北京天气不错啊,shy",
"你知道吗?我可是可以和多个人同时聊天的哦",
"给你讲个笑话吧,据说爱笑的人运气不会太差,不知道真假"
};

@Override
public void onCreate() {
new Thread(new TcpServer()).start();
}

@Nullable
@Override
public IBinder onBind(Intent intent) {

return null;
}

@Override
public void onDestroy() {

mIsServiceDestoryed = true;
super.onDestroy();
}


private class TcpServer implements Runnable{

@SuppressWarnings("resource")
@Override
public void run() {

ServerSocket serverSocket = null;
try{
serverSocket = new ServerSocket(8688);

}catch(IOException e)
{
System.err.println("establish tcp server failed, port:8688");
e.printStackTrace();
return;
}

while(!mIsServiceDestoryed)
{
try {
final Socket client = serverSocket.accept();
System.out.println("accept");

new Thread(){

@Override
public void run() {
try {
responseClient(client);
}catch(IOException e)
{
e.printStackTrace();
}
};
}.start();
}catch(IOException e)
{
e.printStackTrace();
}
}

}
}

private void responseClient(Socket client) throws IOException{

BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())),true);
out.println("欢迎来到聊天室!");

while(!mIsServiceDestoryed){
String str = in.readLine();
System.out.println("msg from client:" + str);
if(str == null) {
break;
}

int i = new Random().nextInt(mDefinedMessages.length);
String msg = mDefinedMessages[i];
out.println(msg);
System.out.println("send :" + msg);
}
System.out.println("client quit.");
MyUtils.close(in);
MyUtils.close(out);
client.close();

}

}

...全文
899 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
small_technical 2018-03-08
  • 打赏
  • 举报
回复
mPrintWriter.println(msg); mPrintWriter.flush(); 这个位置加一个刷新就好了
Poulyield 2018-03-07
  • 打赏
  • 举报
回复
题目错了,是可以连接成功并接收服务端的消息

80,348

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧