Android端与服务端基于TCP/IP协议的Socket通讯

分类:Android 2357人阅读 评论(7) 收藏 举报

什么是TCP/IP协议?

百度百科的解释:Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台电脑规定一个地址。

Wikipedia的解释:TCP/IP协议,包含了一系列构成互联网基础的网络协议。这些协议最早发源于美国国防部的ARPA网项目。TCP/IP模型也被称作DoD模型(Department of Defense Model)。TCP/IP字面上代表了两个协议:TCP(传输控制协议)和IP(网际协议)。

W3Schools的解释:

TCP/IP is the communication protocol for communication between computers on the Internet.

TCP/IP stands forTransmissionControlProtocol /InternetProtocol.

TCP/IP defines how electronic devices (like computers) should be connected to the Internet, and how data should be transmitted between them.


什么是Socket?

Socket是应用层与TCP/IP协议簇通讯的中间抽象层,Socket是一组接口,在设计模式中,Socket的设计就是门面模式,它把复杂的TCP/IP协议簇的内容隐藏在套接字接口后面,用户无需关心协议的实现,只需使用Socket提供的接口即可。

Socket的类型有两种,一种是面向连接的TCP应用服务,一种是面向无连接的UDP(User Data Package)应用服务。通俗的理解就是,TCP方式是打电话(连接性),UDP方式是发短信(无连接)。


Ok,以上是简单的科普,那么接下来就看下如何在Android上利用TCP/IP协议使用Socket与Server进行通讯吧!今天我们要使用的是面向连接的TCP方式。首先,在本机建立一个Java项目作为Server Client,代码如下:

[java] view plain copy
  1. publicclassSocketServer{
  2. //监听端口号
  3. privatestaticfinalintSERVER_PORT=12345;
  4. publicstaticvoidmain(String[]args){
  5. try{
  6. System.out.println("Server:Connecting...");
  7. ServerSocketserverSocket=newServerSocket(SERVER_PORT);
  8. while(true){
  9. //循环监听客户端请求
  10. SocketclientSocket=serverSocket.accept();
  11. System.out.println("Server:Receiving...");
  12. try{
  13. //获取输入流
  14. BufferedReaderin=newBufferedReader(
  15. newInputStreamReader(clientSocket.getInputStream()));
  16. //获取从客户端发来的信息
  17. Stringstr=in.readLine();
  18. System.out.println("Server:Received:'"+str+"'");
  19. }catch(Exceptione){
  20. System.out.println("Server:Error");
  21. e.printStackTrace();
  22. }finally{
  23. clientSocket.close();
  24. System.out.println("Server:Close.");
  25. }
  26. }
  27. }catch(Exceptione){
  28. System.out.println("Server:Error");
  29. e.printStackTrace();
  30. }
  31. }
  32. }

服务端的简单实现就完成了,接下来新建一个Android客户端,布局效果就添加一个Button:



然后是Android客户端的实现:

[java] view plain copy
  1. publicclassSocketAndrodActivityextendsActivity{
  2. /**Calledwhentheactivityisfirstcreated.*/
  3. @Override
  4. publicvoidonCreate(BundlesavedInstanceState){
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. Buttonbutton=(Button)this.findViewById(R.id.btn);
  8. button.setOnClickListener(newOnClickListener(){
  9. @Override
  10. publicvoidonClick(Viewv){
  11. try{
  12. System.out.println("Client:Connecting");
  13. //IP地址和端口号(对应服务端),我这的IP是本地路由器的IP地址
  14. Socketsocket=newSocket("192.168.1.104",12345);
  15. //发送给服务端的消息
  16. Stringmessage="MessagefromAndroidphone";
  17. try{
  18. System.out.println("ClientSending:'"+message+"'");
  19. //第二个参数为True则为自动flush
  20. PrintWriterout=newPrintWriter(
  21. newBufferedWriter(newOutputStreamWriter(
  22. socket.getOutputStream())),true);
  23. out.println(message);
  24. //out.flush();
  25. }catch(Exceptione){
  26. e.printStackTrace();
  27. }finally{
  28. //关闭Socket
  29. socket.close();
  30. System.out.println("Client:Socketclosed");
  31. }
  32. }catch(UnknownHostExceptione1){
  33. e1.printStackTrace();
  34. }catch(IOExceptione){
  35. e.printStackTrace();
  36. }
  37. }
  38. });
  39. }
  40. }

两个工程结构分别如下:



代码部分就完成了,我的实验环境是在Wifi环境下,PC与Android手机都介入当前无线网路,所以程序里的IP地址是我实验环境无线的IP地址,大家要实验的话需要改成你们自己对应的IP地址。

然后是启动服务端,做了这么久Android,启动Java项目大家还没忘记吧(开玩笑),启动后看到下图这个小红点,就说明Server已经起来了,这个时候,Socket端口就一直处于监听状态了,知道客户端有请求过来。



这时,运行Android端的应用程序,点击布局中的按钮,消息就发出去了:



然后在服务端的输出日志中可以看到,已经接收到了来自Android端的数据请求,信息也顺利得到了:



至此,就完成了一个简单的在Android端与Server利用TCP/IP协议进行通讯的Demo,涉及其中知识点与实现方式有不完备的地方希望大家指点并相互交流。Thanks~


源码:下载

更多相关文章

  1. Camera框架初探
  2. 解决android客户端上传图片到服务端时,图片损坏的问题
  3. Android进程间通信(二):通过AIDL介绍Binder的工作机制
  4. Android支付宝-2016最新版支付宝,实现支付功能
  5. Android日常开发(24)[ERROR:ssl_client_socket_impl.cc(946)] hand
  6. 一次完整的HTTP请求与响应涉及了哪些知识?
  7. android中xml直接转json
  8. java做服务器,android做客户端,实现数据传输
  9. Android(安卓)studio上面学习Aidl实现复杂数据类型的传递

随机推荐

  1. ThinkPhp框架 分页 和session验证的使用
  2. PHP之网络编程
  3. 迭代文件夹中的CSV文件,并使用PHP将数据加
  4. PHP安装pdo_mysql的扩展
  5. (高分)我的win2000+php+Apache设置完后,默
  6. 如何扩展这个简单的DataMapper?
  7. php实现无限级分类的树形结构
  8. MySQL / PHP:将整行推入关联数组,_without_
  9. PHP简单防刷计数器
  10. 当使用opendkim在MTA签名时,DKIM失败(身体