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>
- android实现Socket通信一
- Android通信一:Socket通信
- android 实现socket通信
- Android socket 实现 wify 通信,简易聊天室 (一)
- android实现Socket通信二
- android模拟器实现socket通信
- Android实现socket简单通信
- Android socket通信简单实现
- Android客户端实现Socket通信
- [Android通信]基于socket的聊天app(一):实现一对多通信
- android中的网络通信(一) socket编程
- 简单的socket通信Android和Socket(一)
- Android Socket通信(一)--基于UDP协议通信
- Android Socket通信与聊天室的实现
- android实现socket端口通信demo
- android Socket实现多进程通信,互动
- java Socket通信(一)
- java Socket通信(一)
- 解析数据与网络请求
- 存储过程和函数总结
- C语言32个关键字
- HDU 2680 Choose the best route 【最短路 反向建图 dijkstra & SPFA 】
- ArcServer 10安装完成后,访问ArcGIS Server Manager时出现HTTP 错误 500.19 - internet server error
- android实现Socket通信一
- 触发器总结
- CART算法原理及实现
- lua——元表、元方法、继承
- bzoj1045【haoi2008】糖果传递
- mysql中,索引,主键,唯一索引,联合索引的区别
- 华为OJ 整数与IP地址间的转换
- DNS原理及解析流程
- MySQL日志总结