服务端:
<service android:name=".TCPServerService" android:enabled="true" android:process=":remote" android:exported="true"></service> public class TCPServerService extends Service { private boolean mIsServiceDestoryed=false; private String[] mDefinedMessages=new String[]{ "你好", "在吗" }; @Override public void onCreate() { new Thread(new TcpServer()).start(); super.onCreate(); } @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 { //监听本地8688端口 serverSocket=new ServerSocket(12345); } 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 froom 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(out); MyUtils.close(in); client.close(); } }客户端:
public class MainActivity extends AppCompatActivity 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 mMessageEditTest; private PrintWriter mPrintWriter; private Socket mClientSocket; @SuppressLint("HandlerLeak") private Handler mHandler=new Handler(){ @Override public void handleMessage(@NonNull 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); } default:break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mMessageTextView=(TextView)findViewById(R.id.msg_container); mMessageEditTest=(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 view) { if(view==mSendButton){ final String msg=mMessageEditTest.getText().toString(); if(!TextUtils.isEmpty(msg)&&mPrintWriter!=null){ new Thread(){ @Override public void run() { mPrintWriter.println(msg); } }.start(); mMessageEditTest.setText(""); String time=formatDataTime(System.currentTimeMillis()); final String showedMsg="self"+time+":"+msg+"\n"; mMessageTextView.setText(mMessageTextView.getText()+showedMsg); } } } @SuppressLint("SimpleDateFormat") private String formatDataTime(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", 12345); mClientSocket = socket; mPrintWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 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(!MainActivity.this.isFinishing()){ String msg=br.readLine(); System.out.println("receive:"+msg); if(msg!=null){ String time =formatDataTime(System.currentTimeMillis()); 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 MyUtils { public static void close(PrintWriter mPrintWriter) { mPrintWriter.close(); } public static void close(BufferedReader br) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } }