首先客户端设置几个按钮:分别是连接服务器,发送消息,接收消息,关闭连接
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
android:layout_width="match_parent" android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.newer.client.MainActivity">
<Button
android:onClick="startClient"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开启客户端"/>
<Button
android:onClick="sendMsg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发消息"/>
<Button
android:onClick="recMsg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="收消息"/>
<Button
android:onClick="closeClient"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关闭客户端"/>
</LinearLayout>
新建两个Moudle:分别是客户端和服务器
在客户端和服务器的manifests中添加权限:
<uses-permission android:name="android.permission.INTERNET"/>
客户端中的java程序:
服务器的java程序:package com.newer.client; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import com.google.android.gms.appindexing.Action; import com.google.android.gms.appindexing.AppIndex; import com.google.android.gms.appindexing.Thing; import com.google.android.gms.common.api.GoogleApiClient; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; public class MainActivity extends AppCompatActivity { Socket csocket;//客户端的socket OutputStream os;//socket流 BufferedWriter bw; PrintWriter pw; BufferedReader br; /** * ATTENTION: This was auto-generated to implement the App Indexing API. * See https://g.co/AppIndexing/AndroidStudio for more information. */ private GoogleApiClient client; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // ATTENTION: This was auto-generated to implement the App Indexing API. // See https://g.co/AppIndexing/AndroidStudio for more information. client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); } //创建客户端并连接 public void startClient(View view) { //创建客户端必须放到线程中做,开始线程 new Thread(new Runnable() { @Override public void run() { try { if(csocket ==null) csocket = new Socket("127.0.0.1", 54321); } catch (IOException e) { e.printStackTrace(); } } }).start(); } public void sendMsg(View view) { new Thread(new Runnable() { @Override public void run() { try { os = csocket.getOutputStream(); bw = new BufferedWriter(new OutputStreamWriter(os)); pw = new PrintWriter(bw,true); pw.println("hello server"); } catch (IOException e) { e.printStackTrace(); } } }).start(); } public void recMsg(View view) { new Thread(new Runnable() { @Override public void run() { while(true){ try { br = new BufferedReader(new InputStreamReader(csocket.getInputStream())); String res = br.readLine(); if(res != null) Log.d("TAG","server say:"+res); } catch (IOException e) { e.printStackTrace(); } } } }).start(); } public void closeClient(View view) { //关闭 socket if(csocket.isBound()) { try { csocket.close(); csocket = null; } catch (IOException e) { e.printStackTrace(); } } } /** * ATTENTION: This was auto-generated to implement the App Indexing API. * See https://g.co/AppIndexing/AndroidStudio for more information. */ public Action getIndexApiAction() { Thing object = new Thing.Builder() .setName("Main Page") // TODO: Define a title for the content shown. // TODO: Make sure this auto-generated URL is correct. .setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]")) .build(); return new Action.Builder(Action.TYPE_VIEW) .setObject(object) .setActionStatus(Action.STATUS_TYPE_COMPLETED) .build(); } @Override public void onStart() { super.onStart(); // ATTENTION: This was auto-generated to implement the App Indexing API. // See https://g.co/AppIndexing/AndroidStudio for more information. client.connect(); AppIndex.AppIndexApi.start(client, getIndexApiAction()); } @Override public void onStop() { super.onStop(); // ATTENTION: This was auto-generated to implement the App Indexing API. // See https://g.co/AppIndexing/AndroidStudio for more information. AppIndex.AppIndexApi.end(client, getIndexApiAction()); client.disconnect(); } }
先运行服务器程序,显示服务器等待客户端连接。package com.newer.server; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class MainActivity extends AppCompatActivity { ServerSocket sSocket; Socket cSocket; BufferedReader br; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initServer(); } private void initServer() { new Thread(new Runnable() { @Override public void run() { try { sSocket = new ServerSocket(54321); Log.d("TAG","服务端开启,等待客户端连接"); cSocket = sSocket.accept(); Log.d("TAG","客户端连接成功:"+cSocket.getInetAddress()); mHanler.sendEmptyMessage(2); } catch (IOException e) { e.printStackTrace(); } } }).start(); } Handler mHanler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { if(msg.what==2){ recMsg(); } return false; } }); private void recMsg(){ new Thread(new Runnable() { @Override public void run() { try { br = new BufferedReader(new InputStreamReader( cSocket.getInputStream())); String res = br.readLine(); if(res!= null) Log.d("TAG","client say:"+res); } catch (IOException e) { e.printStackTrace(); } } }).start(); } }