前面介紹了Socket的簡介和原理,今天簡單的來實現一下客服端與服務器通信的功能
客服端
建立連接
try {
socket = new Socket("192.168.1.100", 9999); Log.i("Android", "與服務器建立連接:" + socket); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
發送消息
try { // socket.getInputStream() DataOutputStream writer = new DataOutputStream(socket.getOutputStream()); writer.writeUTF("嘿嘿,你好啊,服務器.."); // 寫一個UTF-8的信息 System.out.println("發送消息"); } catch (IOException e) { e.printStackTrace(); }
添加權限
<uses-permission android:name="android.permission.INTERNET"/>
服務端(在Eclipse建立一個Java項目即可)
import java.io.DataInputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class SocketServer { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("123456"); startService(); } /** * 啟動服務監聽,等待客戶端連接 */ private static void startService() { try { // 創建ServerSocket ServerSocket serverSocket = new ServerSocket(9999); System.out.println("--開啟服務器,監聽端口 9999--"); // 監聽端口,等待客戶端連接 while (true) { System.out.println("--等待客戶端連接--"); Socket socket = serverSocket.accept(); //等待客戶端連接 System.out.println("得到客戶端連接:" + socket); startReader(socket); } } catch (IOException e) { e.printStackTrace(); } } /** * 從參數的Socket里獲取最新的消息 */ private static void startReader(final Socket socket) { new Thread(){ @Override public void run() { DataInputStream reader; try { // 獲取讀取流 reader = new DataInputStream( socket.getInputStream()); while (true) { System.out.println("*等待客戶端輸入*"); // 讀取數據 String msg = reader.readUTF(); System.out.println("獲取到客戶端的信息:" + msg); } } catch (IOException e) { e.printStackTrace(); } } }.start(); } }
運行Java項目,得到

然后在手機端點擊發送消息

服務端接收到消息,打印信息

服務端發送消息給客戶端
服務端代碼:
public class TestServer { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(30000); System.out.println("服務器已連接"); while(true){ System.out.println("123"); Socket socket = serverSocket.accept(); OutputStream outputStream = socket.getOutputStream(); outputStream.write("你好,我是服務器\n".getBytes("utf-8")); outputStream.close(); socket.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
客戶端代碼
public class Demo2Activity extends AppCompatActivity { static TextView textView; Socket socket; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.demo2); initView(); } private void initView(){ textView = (TextView) findViewById(R.id.txt_1); new Thread(new Runnable() { @Override public void run() { try { socket = new Socket("192.168.1.101", 30000); // socket.setSoTimeout(10000);//設置10秒超時 Log.i("Android", "與服務器建立連接:" + socket); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line = br.readLine(); Log.i("Android", "與服務器建立連接:" + line); Message msg = new Message(); msg.what = 1; msg.obj = line; handler.sendMessage(msg); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }catch (Exception e){ e.printStackTrace(); } } }).start(); } Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 1){ textView.setText("這是來自服務器的數據:"+msg.obj.toString()); } } }; }
先運行服務端,再運行客戶端
效果圖:


源碼包含多個demo,也是參考網上資料而來
源碼地址:https://github.com/DickyQie/android-socket
