android实现Socket通信一

来源:互联网 发布:微信小程序erp软件 编辑:程序博客网 时间:2024/06/01 08:18

两个应用间实现通过SOCKET进行通信。

主要是通过socket和serversocket,这两个东西怎么用呢?

1、在服务端通过serversocket监听一个端口,这个端口用于接收客户单发送的消息, ServerSocket server = new ServerSocket(8081)。

2、在服务端在建立一个socket,用于和客户端进行通信 Socket socket = server.accept()。当客户单的socket建立成功时(Socket socket=new Socket("127.0.0.1",8081)),服务端的socket也就生成了。

3、两端的socket通过输入输出流来进行通信:

getInputStream方法获得网络连接输入,同时返回一个IutputStream对象实例.(获得另一输入过来的信息)。

getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。(可以用于服务端把信息写回到客户端去)。


关于阻塞,两个阻塞的地方:

1、server.accept() ,直到有客户端的socket连上来。 

2、br.readLine(),直到对方向输出流中写入东西时。


关于端口: 

在选择端口时,必须小心。每一个端口提供一种特定的服务,只有给出正确的端口,才 能获得相应的服务。 0~1023的端口号为系统所保留,例如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为23, 所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲突。


客户端的代码:

package com.example.socket_client;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.Writer;import java.net.ServerSocket;import java.net.Socket;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener {private final static String TAG = "SOCKET_CLIENT";EditText input = null;Button btnSend = null;ServerSocket serverSocket = null;public final static int MSG_FROM_SERVER = 1002;private boolean isOk = true;private Handler mHandler = new Handler(){public void handleMessage(android.os.Message msg) {if(msg.what == MSG_FROM_SERVER){input.setText(null);Toast.makeText(MainActivity.this, "收到了服务器消息 :" + (String)msg.obj, Toast.LENGTH_LONG).show();}};};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);input = (EditText)findViewById(R.id.id_input);btnSend = (Button)findViewById(R.id.btnSend);btnSend.setOnClickListener(this);try {serverSocket = new ServerSocket(8082);new Thread(new ReceiverRunnable()).start();}catch (IOException e) {Log.d(TAG, "IOException = " + e);}}@Overridepublic void onClick(View arg0) {new Thread(){public void run(){try{Socket socket=new Socket("127.0.0.1",8081);// 连接服务器端// 用法发送消息到服务器端Writer writer = new OutputStreamWriter(socket.getOutputStream());String inputStr = input.getText().toString();Log.d(TAG, "inputStr = " + inputStr);if(inputStr != null){writer.write(inputStr);writer.flush();}writer.close(); //关闭Socket输出流socket.close(); //关闭Socket}catch(Exception e) {Log.d(TAG, "", e);}}}.start();}class ReceiverRunnable implements Runnable {@Overridepublic void run() {while (isOk) {try {if(serverSocket == null || serverSocket.isClosed()){break;}Socket socket = serverSocket.accept();// 由Socket对象得到输入流,并构造相应的BufferedReader对象 读取服务器端发回来的消息BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String msgFromServer = br.readLine();if (msgFromServer != null) {Message msg = mHandler.obtainMessage(MSG_FROM_SERVER);msg.obj = msgFromServer;mHandler.sendMessage(msg);}br.close(); // 关闭Socket输入流socket.close();}catch (IOException e) {isOk = false;Log.d(TAG, "ReceiverRunnable IOException", e);}}}}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();try {isOk = false;serverSocket.close();}catch (IOException e) {Log.d(TAG, "onDestroy IOException", e);}}}


activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    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"    tools:context="com.example.socket_client.MainActivity" >    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world" />    <EditText        android:id="@+id/id_input"        android:layout_width="match_parent"        android:layout_height="50dp" />    <Button        android:id="@+id/btnSend"        android:layout_width="match_parent"        android:layout_height="50dp"        android:layout_below="@id/id_input"        android:text="send" /></RelativeLayout>


AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.socket_client"    android:versionCode="1"    android:versionName="1.0" >    <uses-permission android:name="android.permission.INTERNET" />    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="21" />    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name=".MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application></manifest>


服务端代码:

MainActivity

package com.example.socket_server;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;public class MainActivity extends ActionBarActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// start serviceIntent intent = new Intent(MainActivity.this,SocketServer.class);this.startService(intent);}}

SocketServer

package com.example.socket_server;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.Writer;import java.net.ServerSocket;import java.net.Socket;import java.net.UnknownHostException;import android.app.Service;import android.content.Intent;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.util.Log;import android.widget.Toast;public class SocketServer extends Service {public final static int MSG_RECEIVED = 1001;private final static String TAG = "SOCKET_SERVER";/** * 显示客户单输入的信息 */public Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case MSG_RECEIVED:Toast.makeText(SocketServer.this, "From Server : " + (String) msg.obj, Toast.LENGTH_SHORT).show();break;}}};@Overridepublic IBinder onBind(Intent arg0) {return null;}@Overridepublic void onCreate() {super.onCreate();final int port = 8081;new Thread() {public void run() {ServerSocket server = null;try {/** * 服务端监听本机的一个端口,等待客户端向这个端口发送的消息 */server = new ServerSocket(port); // TODO 这个端口是干啥用的?必须要指定吗?while (true) {// server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的Socket socket = server.accept(); // accept一个socket,和客户单建立连接// 每接收到一个Socket就建立一个新的线程来处理它new Thread(new RecevierRunnable(socket)).start();}}catch (IOException e) {e.printStackTrace();}}}.start();}/** * 独立的线程来接收消息 *  * @author lixiaoming *  */class RecevierRunnable implements Runnable {Socket socket;String ip;public RecevierRunnable(Socket socket) {this.socket = socket;this.ip = socket.getInetAddress().getHostAddress();}public void run() {try {receivedMsgBySocket();}catch (Exception e) {e.printStackTrace();}}private void receivedMsgBySocket() throws Exception {Log.d(TAG, "receivedMsgBySocket() start");BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String strFromClient = br.readLine();Message msg = handler.obtainMessage(MSG_RECEIVED);msg.obj = strFromClient;handler.sendMessage(msg);br.close();socket.close();sendMsgToClient(ip,8082,strFromClient);Log.d(TAG, "receivedMsgBySocket() end");}private void sendMsgToClient(String ip,int prot,String msg){Log.d(TAG, "sendMsgToClient() start , ip = " + ip);try {Socket toClientSocket = new Socket(ip,prot);// 读完后写一句Writer writer = new OutputStreamWriter(toClientSocket.getOutputStream(), "UTF-8");writer.write("你好,客户端:" + ip + ",我是服务端,我已经收到你的消息了,你说 :" + msg);writer.flush();writer.close();toClientSocket.close();}catch (UnknownHostException e) {Log.d(TAG, "sendMsgToClient () UnknownHostException",e);}catch (IOException e) {Log.d(TAG, "sendMsgToClient () IOException",e);}Log.d(TAG, "sendMsgToClient() start");}}}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    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"    tools:context="com.example.socket_server.MainActivity" >    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world" /></RelativeLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.socket_server"    android:versionCode="1"    android:versionName="1.0" >    <uses-permission android:name="android.permission.INTERNET" />    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="21" />    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name=".MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <service             android:name = "com.example.socket_server.SocketServer"></service>    </application></manifest>




0 0
原创粉丝点击