我们先启一个服务,用来做服务器端。所以现在主线程中起一个服务。
package com.android.tcpservice; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import com.android.tcpservice.service.TCPService; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init(){ Intent intent = new Intent(this, TCPService.class); // this.startService(intent); } }由于网络连接不允许放在主线程中操作,所以我们得新启一个线程。在新启的线程中操作:
package com.android.tcpservice.service; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.support.annotation.Nullable; import android.util.Log; import com.android.tcpservice.TCPLogic; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; /** * Created by xalo on 16/8/24. * 服务器 */ public class TCPService extends Service { @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); //写一个匿名类,新起一个线程 new Thread(new Runnable() { @Override public void run() { Log.d("TCP", "TCP Thread is running 启动了"); try { //接口服务(监听接口) ServerSocket ss = new ServerSocket(50000); //获得链接(阻断式)这条数据是阻塞式的 Socket socket; //接受消息 while ((socket = ss.accept()) != null) { new Thread(new TCPLogic(socket)).start(); } Log.d("XML", socket.getInetAddress().toString()); } catch (IOException e) { e.printStackTrace(); } Log.d("TCP", "TCP Thread is end 结束了"); } }).start(); } }新建一个类实现Running。
package com.android.tcpservice; import android.util.Log; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.Socket; /** * Created by xalo on 16/8/24. */ public class TCPLogic implements Runnable { Socket socket; public TCPLogic(Socket socket) { this.socket = socket; } @Override public void run() { try { InputStream in = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in)); String str; while ((str = br.readLine()) != null) { Log.d("RECIVER", str); } } catch (IOException e) { e.printStackTrace(); } } }最后不要忘了加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
这样我们的服务器端就搭建好了
下面来看看客户端是怎么搭建起来的:
package com.android.tcpclient; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; /** * 客户端 */ public class MainActivity extends AppCompatActivity { Socket socket; // BufferedWriter bw; PrintWriter pw; Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); new Thread(new Runnable() { @Override public void run() { try { connect(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } private void init() { btn = (Button) findViewById(R.id.btn_send); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendMsg("hello"); } }); } //网络连接不允许在主线程执行 private void connect() throws IOException { InetAddress address = InetAddress.getByName("localhost"); socket = new Socket(address, 50000); //发送消息 //以我为参考系向外发流 OutputStream out = socket.getOutputStream(); //缓存区满了一次性发出去 // bw = new BufferedWriter(new OutputStreamWriter(out)); pw = new PrintWriter(out); // bw.write("hello"); // //疏通 // bw.flush(); // //关闭 // socket.close(); } private void sendMsg(String msg) { // try { // pw.write(msg); //换行,接受的时候是按行读,不换行接受服务器认为这行没完。 pw.println(msg); pw.flush(); // } catch (IOException e) { // e.printStackTrace(); // } } private void closeSocket() { try { // pw.flush(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } @Override protected void onDestroy() { super.onDestroy(); closeSocket(); } }