夜鹰教程网-程序员的加油站
 当前位置:文章中心 >> Android/移动互联网/物联网/
利用TCP/IP实现Android客户端与服务端的Socket通讯
夜鹰教程网 来源:www.yyjcw.com 日期:2018-6-28 13:17:55
利用TCP/IP实现Android客户端与服务端的Socket通讯

什么是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 for Transmission Control Protocol / Internet Protocol.

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方式是发短信(无连接)。

1355023551_2045.png

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

[java] view plain copy

public class SocketServer {  

    //监听端口号  

    private static final int SERVER_PORT = 12345;  

  

    public static void main(String[] args) {  

        try {  

            System.out.println("Server: Connecting...");  

            ServerSocket serverSocket = new ServerSocket(SERVER_PORT);  

            while (true) {  

                //循环监听客户端请求  

                Socket clientSocket = serverSocket.accept();  

                System.out.println("Server: Receiving...");  

                try {  

                    //获取输入流  

                    BufferedReader in = new BufferedReader(  

                            new InputStreamReader(clientSocket.getInputStream()));  

                    //获取从客户端发来的信息  

                    String str = in.readLine();  

                    System.out.println("Server: Received: '" + str + "'");  

                } catch (Exception e) {  

                    System.out.println("Server: Error");  

                    e.printStackTrace();  

                } finally {  

                    clientSocket.close();  

                    System.out.println("Server: Close.");  

                }  

            }  

  

        } catch (Exception e) {  

            System.out.println("Server: Error");  

            e.printStackTrace();  

        }  

    }  

}  


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



然后是android客户端的实现:

[java] view plain copy

public class SocketAndrodActivity extends Activity {  

    /** Called when the activity is first created. */  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.main);  

  

        Button button = (Button) this.findViewById(R.id.btn);  

        button.setOnClickListener(new OnClickListener() {  

  

            @Override  

            public void onClick(View v) {  

                try {  

                    System.out.println("Client:Connecting");  

                    //IP地址和端口号(对应服务端),我这的IP是本地路由器的IP地址  

                    Socket socket = new Socket("192.168.1.104", 12345);  

                    //发送给服务端的消息  

                    String message = "Message from Android phone";  

                    try {  

                        System.out.println("Client Sending: '" + message + "'");  

                          

                        //第二个参数为True则为自动flush  

                        PrintWriter out = new PrintWriter(  

                                new BufferedWriter(new OutputStreamWriter(  

                                        socket.getOutputStream())), true);  

                        out.println(message);  

//                      out.flush();  

                    } catch (Exception e) {  

                        e.printStackTrace();  

                    } finally {  

                        //关闭Socket  

                        socket.close();  

                        System.out.println("Client:Socket closed");  

                    }  

                } catch (UnknownHostException e1) {  

                    e1.printStackTrace();  

                } catch (IOException e) {  

                    e.printStackTrace();  

                }  

  

            }  

        });  

    }  

}  


两个工程结构分别如下:

1355024139_7007.png

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

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

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

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

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


复制链接 网友评论 收藏本文 关闭此页
上一条: android端实现断点续传功能  下一条: Invalid project description overlaps…
夜鹰教程网成立于2008年,目前已经运营了将近 13 年,发布了大量关于 html5/css3/C#/asp.net/java/python/nodejs/mongodb/sql server/android/javascript/mysql/mvc/easyui/vue/echarts原创教程。 我们一直都在坚持的是:认证负责、一丝不苟、以工匠的精神来打磨每一套教程,让读者感受到作者的用心。我们默默投入的时间,确保每一套教程都是一件作品,而不是呆板的文字和视频! 目前我们推出在线辅导班试运营,模式为一对一辅导,教学工具为QQ。我们的辅导学科包括 java 、android原生开发、webapp开发、商城开发、C#和asp.net开发,winform和物联网开发、web前端开发,但不仅限于此。 普通班针对的是国内学员,例如想打好基础的大学生、想转行的有志青年、想深入学习的程序员、想开发软件的初学者或者业余爱好者等。 就业办针对即将毕业上岗的大四学生,或者打算转行的初级开发工程师。 留学生班针对的是在欧美、加拿大、澳洲、日本、韩国、新加坡等地留学的中国学子,目的是让大家熟练地掌握编程技能,按时完成老师布置的作业,并能顺利地通过考试。 详细咨询QQ:1416759661   夜鹰教程网  基于角色的权限管理系统(c-s/b-s)。
  夜鹰教程网  基于nodejs的聊天室开发视频教程
  夜鹰教程网  Git分布式版本管理视频教程
  夜鹰教程网  MVC+EasyUI视频教程
  夜鹰教程网  在线考试系统视频教程
  夜鹰教程网  MongoDB视频教程。
  夜鹰教程网 Canvas视频教程
  夜鹰教程网 报表开发视频教程
  热点推荐
在Struts 2中使用JSON Ajax支持
解决JSP中使用request乱码问题
JSP+JavaScript打造二级级联下拉菜…
Tomcat中文手册(1)
JSP及Servlet中遇到的多线程同步
详解:JSP和Servlet中的绝对路径和…
JSP Struts之HTML标签库详解
自定义JSP标签
JSP中的include指令
errorPage设置方法--JSP
JSP 国际化-格式化货币和日期
九个隐含对象使用总结JSP的
Tomcat中文手册(2)
tomcat6关于EL表达式的一个错误
jsp分页技术代码
  最近更新
iOS 关于退出键盘两种方法和避免遮…
安卓apk签名常见命令
把activity当成dialog使用
如何选择APP开发框架
Layout _width ,Layout_height和…
Android调用百度地图使用时出现in…
安卓刷机术语
android端实现断点续传功能
利用TCP/IP实现Android客户端与服…
Invalid project description ove…
推荐使用的meta标签
手机网站用Bootstrap还是jQuery M…
如何让手机访问PC网站自动跳转到手…
提升HTML5的性能体验系列之一 避免…
Android和IOS 字体该做多大合适?…

关于我们 | 网站建设 | 技术辅导 | 常见问题 | 联系我们 | 友情链接

夜鹰教程网 版权所有 www.yyjcw.com All rights reserved 备案号:蜀ICP备08011740号3