爱华对Android Socket 传输的理解.doc_第1页
爱华对Android Socket 传输的理解.doc_第2页
爱华对Android Socket 传输的理解.doc_第3页
爱华对Android Socket 传输的理解.doc_第4页
爱华对Android Socket 传输的理解.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Index爱华 个人项目中遇到的情况。1, 理论11, PC to PC32, Android To PC53 Android to Android9Android开发入门Socket编程15浅谈JavaSocket编程及应用191, 理论从来没有碰过这些玩意,或者就是一无所知,结果今天花了半天,看了两个列子,立马明白了。看来学习程序,从应用开始,再回归理论,再应用。首先,socket 和 serverSocket 两个封装完美的类,剩下的就是简单的 I/O流 操作。Client 与 server 都是相对的。如果 两者互发,那么可以说两者都兼两个角色。我们就举最简单的例子: 单发,client Server.那么单发,client Server. client 端 server端 具体怎么mapping 呢?如下: 很多代码类似Client sideServer sideFieldimport .Socket;static Socket client;import .ServerSocket;import .Socket;建立sideclient = new Socket(, 8800); 客户端要写清服务端的ip和客户端portServerSocket server = new ServerSocket(8800);服务端只要客户端port拿到对方对象Socket client = server.accept();一旦客户端发送请求,服务端通过accept就完全得到客户端的client.如何发消息给对方1,建立向server消息的工具PrintWriter out = new PrintWriter(client.getOutputStream();建立向server的消息内容申请输入操作BufferedReader wt = new BufferedReader(new InputStreamReader(System.in);2,while (true) String str = wt.readLine();out.println(str);这个就是发送消息出去out.flush();这个就是刷新1,建立向clientside 发消息的工具PrintWriter out = new PrintWriter(client.getOutputStream();2,while (true) out.println(“server side received”);这个就是发送消息出去out.flush();这个就是刷新如何接收对方消息1,建立接受server消息的工具BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream();2,打印接受server的外部消息System.out.println(in.readLine(); / Read the server-side, write tothe client “has receiving”1,建立接受client side消息的工具BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream();2,打印接受server的外部消息while (true) String str = in.readLine();System.out.println(str); / Read client, to write server-sideif (str.equals(end)break;后事操作client.close();client.close();双发 client server 端: (与单发 非常相似)Client sideServer sideFieldimport .Socket;static Socket client;import .ServerSocket;import .Socket;建立sideclient = new Socket(, 8800); 客户端要写清服务端的ip和客户端port程序执行这一部,就等于向本机的4700端口(Server)发出客户请求 ServerSocket server = new ServerSocket(8800);服务端只要客户端port拿到对方对象Socket client = server.accept();一旦客户端发送请求,服务端通过accept就完全得到客户端的client.如何发消息给对方1,建立向server消息的工具PrintWriter out = new PrintWriter(client.getOutputStream();建立向server的消息内容申请输入操作BufferedReader sysIn = new BufferedReader(new InputStreamReader(System.in);2,while (true) String str = sysIn.readLine();out.println(str);这个就是发送消息出去out.flush();这个就是刷新1,建立向clientside 发消息的工具PrintWriter out = new PrintWriter(client.getOutputStream();/由系统标准输入设备构造BufferedReader对象BufferedReader sin = new BufferedReader(new InputStreamReader(System.in);2,line = sin.readLine();/ 从标准输入读入一字符串while (!line.equals(bye) / 如果该字符串为 bye,则停止循环os.println(line);/ 向客户端输出该字符串os.flush();/ 刷新输出流,使Client马上收到该字符串line = sin.readLine();如何接收对方消息1,建立接受server消息的工具BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream();2,打印接受server的外部消息System.out.println(in.readLine(); / Read the server-side, write tothe client “has receiving”1,建立接受client side消息的工具BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream();2,打印接受server的外部消息while (true) String str = in.readLine();System.out.println(str); / Read client, to write server-sideif (str.equals(end)break;后事操作out.close(); / 关闭Socket输出流in.close(); / 关闭Socket输入流client.close(); / 关闭Socketos.close(); / 关闭Socket输出流is.close(); / 关闭Socket输入流socket.close(); / 关闭Socketserver.close(); / 关闭ServerSocket分为以下几种: Client Server 1, PCto PC2, PC to Android3, Android to PC4, Android to Android1, PC to PC, 代码如下:PC-Client:import java.io.*;import .Socket;public class TalkClient public static void main(String args) try Socket socket = new Socket(, 4700);/ 向本机的4700端口发出客户请求 send client request to port 4700BufferedReader sin = new BufferedReader(new InputStreamReader(System.in);/ 由系统标准输入设备构造BufferedReader对象PrintWriter os = new PrintWriter(socket.getOutputStream();/ 由Socket对象得到输出流,并构造PrintWriter对象BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream();/ 由Socket对象得到输入流,并构造相应的BufferedReader对象String readline;readline = sin.readLine(); / 从系统标准输入读入一字符串while (!readline.equals(bye) / 若从标准输入读入的字符串为 bye则停止循环os.println(readline);/ 将从系统标准输入读入的字符串输出到Serveros.flush();/ 刷新输出流,使Server马上收到该字符串System.out.println(in Talke Client,Client: + readline);/ 在系统标准输出上打印读入的字符串System.out.println(in Talke Client,Server: + is.readLine();/ 从Server读入一字符串,并打印到标准输出上readline = sin.readLine(); / 从系统标准输入读入一字符串 / 继续循环os.close(); / 关闭Socket输出流is.close(); / 关闭Socket输入流socket.close(); / 关闭Socket catch (Exception e) / TODO: handle exceptionPC Server:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import .ServerSocket;import .Socket;public class TalkServer public static void main(String args) ServerSocket server = null;try server = new ServerSocket(4700);/ 创建一个ServerSocket在端口4700监听客户请求Socket socket = server.accept();/ 使用accept()阻塞等待客户请求,有客户/ 请求到来则产生一个Socket对象,并继续执行String line;BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream();/ 由Socket对象得到输入流, 并且构造相应的BufferedReader对象PrintWriter os = new PrintWriter(socket.getOutputStream();/ 由Socket对象得到输出流,并构造PrintWriter对象BufferedReader sin = new BufferedReader(new InputStreamReader(System.in);/ 由系统标准输入设备构造BufferedReader对象System.out.println(Talk Server Client: + is.readLine();/ 在标准输出上打印从客户端读入的字符串line = sin.readLine();/ 从标准输入读入一字符串while (!line.equals(bye) / 如果该字符串为 bye,则停止循环os.println(line);/ 向客户端输出该字符串os.flush();/ 刷新输出流,使Client马上收到该字符串System.out.println(in Talke Server,Server: + line);/ 在系统标准输出上打印读入的字符串System.out.println(in Talke Server,Client: + is.readLine();/ 从Client读入一字符串,并打印到标准输出上line = sin.readLine();/ 从系统标准输入读入一字符串 / 继续循环os.close(); / 关闭Socket输出流is.close(); / 关闭Socket输入流socket.close(); / 关闭Socketserver.close(); / 关闭ServerSocket catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();2, Android To PCClient-Android:其实懂得了PC to PC, 到了Android,只要知道要进行重定向,就OK了。P.S. 在Android下, ”或者”local” 代表Android Device, (默认定义,无法修改)“”在Android里指的是pc 端。”或者”local” 在pc,也指pc本地。好现在我们看看怎么重定向?(一)PC -Server Android-ClientPC -Server: final int SERVER_PORT = 12345;/ mapping PC port 12555 with Simulator port 12345.Runtime.getRuntime().exec(adb forward tcp:12555 tcp:12345);/ServerSocket serverSocket = new ServerSocket(12345);Android Client:Host: (PC端) port:12345(二) PC-Client Android-ServerPC - Client:/ mapping PC port 12581 with Simulator port 6666.Runtime.getRuntime().exec(adb forward tcp:12581 tcp:6666);serverAddr = InetAddress.getByName();socket = new Socket(serverAddr, 12581);/ 此处的12581是PC开放的端口,已重定向到Device的6666端口Android - Server:Port: 6666代码如下:Client-Android:package hf.socket.client;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import .Socket;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.content.DialogInterface;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.EditText;import android.widget.TextView;public class ActivityMain extends Activity private TextView txtRecord;private EditText input;private String host = ;private int port = 5556;Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.main);input = (EditText) findViewById(R.id.input);txtRecord = (TextView) findViewById(R.id.txtRecord);findViewById(R.id.btnSubmit).setOnClickListener(new View.OnClickListener() Overridepublic void onClick(View v) txtRecord.append(n + client:+ input.getText().toString();socketTo(input.getText().toString(););findViewById(R.id.btnSetHost).setOnClickListener(new View.OnClickListener() Overridepublic void onClick(View v) showDialog(0););setTitle(Socket to + host + : + port);Overrideprotected Dialog onCreateDialog(int id) final View v = View.inflate(this, R.layout.set, null);final EditText inputHost = (EditText) v.findViewById(R.id.inputHost);final EditText inputPort = (EditText) v.findViewById(R.id.inputPort);return new AlertDialog.Builder(this).setTitle(Config ServerHost).setView(v).setPositiveButton(Set,new DialogInterface.OnClickListener() Overridepublic void onClick(DialogInterface arg0, int arg1) host = inputHost.getText().toString();port = Integer.parseInt(inputPort.getText().toString();setTitle(Socket to + host + : + port);).create();private final void socketTo(final String msg) Socket socket = null;try socket = new Socket(host, port);Log.d(, socker connect);/ send msgPrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), true);out.println(msg);/ receive responseBufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream();String response = br.readLine();if (response != null) txtRecord.append(n + server: + response); else txtRecord.append(n + no response from server);txtRecord.append(n + -close-);/ close connectionout.close();br.close();socket.close(); catch (Exception e) Log.e(, e.getMessage();PC - Server:package socketServer;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import .ServerSocket;import .Socket;public class TestIIServer implements Runnable private ServerSocket server;private Socket client;public static void main(String args) new Thread(new TestIIServer().start();Overridepublic void run() try / mapping PC port 12555 with Simulator port 12345.Runtime.getRuntime().exec(adb forward tcp:12555 tcp:12345);/System.out.println(s: connecting.);ServerSocket serverSocket = new ServerSocket(12345);while (true) Socket client = serverSocket.accept();System.out.println(s: receiving.);try BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream();String str = in.readLine();System.out.println(s: received: + str + );PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream(), true);out.println(s: received: + str + ); catch (Exception e) System.out.println(s: error);e.printStackTrace(); finally client.close();System.out.println(s:done); catch (Exception e) System.out.println(s:error);e.printStackTrace();3 Android to AndroidAndroid Client:ip port: 12581(pc开放端口) Android Server: ( 假定Emualtor 端口号是 5554, 默认Socket端口为6666)adb -s emulator-5554 forward tcp: 12581 tcp: 6666其实就是用了 PC-Android两种情况的合体。 假设中间有个PC端。代码如下:Android - Client:package hf.socket.client;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import .Socket;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.content.DialogInterface;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.EditText;import android.widget.TextView;public class ActivityMain extends Activity private TextView txtRecord;private EditText input;private String host = ;private int port = 5556;Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.main);input = (EditText) findViewById(R.id.input);txtRecord = (TextView) findViewById(R.id.txtRecord);findViewById(R.id.btnSubmit).setOnClickListener(new View.OnClickListener() Overridepublic void onClick(View v) txtRecord.append(n + client:+ input.getText().toString();socketTo(input.getText().toString(););findViewById(R.id.btnSetHost).setOnClickListener(new View.OnClickListener() Overridepublic void onClick(View v) showDialog(0););setTitle(Socket to + host + : + port);Overrideprotected Dialog onCreateDialog(int id) final View v = View.inflate(this, R.layout.set, null);final EditText inputHost = (EditText) v.findViewById(R.id.inputHost);final EditText inputPort = (EditText) v.findViewById(R.id.inputPort);return new AlertDialog.Builder(this).setTitle(Config ServerHost).setView(v).setPositiveButton(Set,new DialogInterface.OnClickListener() Overridepublic void onClick(DialogInterface arg0, int arg1) host = inputHost.getText().toString();port = Integer.parseInt(inputPort.getText().toString();setTitle(Socket to + host + : + port);).create();private final void socketTo(final String msg) Socket socket = null;try socket = new Socket(host, port);Log.d(, socker connect);/ send msgPrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), true);out.println(msg);/ receive responseBufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream();String response = br.readLine();if (response != null) txtRecord.append(n + server: + response); else txtRecord.append(n + no response from server);txtRecord.append(n + -close-);/ close connectionout.close();br.close();socket.close(); catch (Exception e) Log.e(, e.getMessage();Android - Server:1, mainActivitypackage hf.socket.server;import .InetAddress;import .NetworkInterface;import java.util.ArrayList;import java.util.Enumeration;import android.app.Activity;import android.app.ActivityManager;import android.app.AlertDialog;import android.app.Dialog;import android.app.ActivityManager.RunningServiceInfo;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.ProgressBar;import android.widget.TextView;import android.widget.Toast;public class ActivityMain extends Activity implements OnClickListener private static final String SocketServiceName = hf.socket.server.SocketService;private Button btnStart, btnStop;private ProgressBar progressBar;private TextView txtIpAddress;public static final String HOST = ;public static int PORT = 9999;Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.main);txtIpAddress = (TextView) findViewById(R.id.txtIpAddress);progressBar = (ProgressBar) findViewById(R.gressBar);btnStart = (Button) findViewById(R.id.btnStart);btnStop = (Button) findViewById(R.id.btnStop);btnStart.setOnClickListener(this);btnStop.setOnClickListener(this);findViewById(R.id.btnSet).setOnClickListener(new View.OnClickListener() Overridepublic void onClick(View v) if (!isSocketServerOn() showDialog(0); else Toast.makeText(getBaseContext(),Can not change portNo while Service is running!,Toast.LENGTH_SHORT).show(););/ Get localhost IP addressEnumeration netInterfaces = null;StringBuffer sb = new StringBuffer();try netInterfaces = NetworkInterface.getNetworkInterfaces();while (netInterfaces.hasMoreElements() NetworkInterface ni = netInterfaces.nextElement();Enumeration ips = ni.getInetAddresses();while (ips

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论