/********************************************************************************************
* author:conowen@大钟
* E-mail:conowen@hotmail.com
* http://blog.csdn.net/conowen
* 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。
********************************************************************************************/
1、Socket的简介
通常来说,Socket也称为“套接字”。从字面上面来看,socket的中文意思为“插座”。举个例子,一台服务器可能会提供很多服务,每种服务对应一个Socket,(也可以这么说,每个Socket就是一个插座,客户若是需要这种服务,就将插头到相应的插座上面就行了)而客户的“插头”也是一个Socket。服务端要和客户端通信,两者都要实例化一个Socket。
Java在包java.net里面提供了两个类:ServerSocket和Socket,前者用于实例化服务器的Socket,后者用于实例化客户端的Socket,也就是说服务器和客户端的Socket是不一样的。
2、Socket的通信过程简单描述
通常来说,我们只需要构造客户端的Socket来和目标服务器通信即可,但是为了方便演示,下面假设服务器也是我们自己架构。
2.1、首先,构造客户端Socket
构造客户端的Socket方法有以下几种,参数里面通常都是指向目标服务器的IP地址、目标服务器的端口号,目标服务器的主机名。
如://注意,0~1023端口为系统保留,用户设定的端口号应该大于1023
proxy为代理服务器地址,dstaddress为目标服务器ip地址,dstport为目标服务器的端口号,(因为服务器的每种服务都会绑定在一个端口上面),dstName为目标服务器的主机名。
2.2、然后再构造服务器的ServerSocket
构造服务器的Socket有以下几种
如:
构造完ServerSocket 之后,需要调用ServerSocket.accept()方法来等待客户端的请求(因为socket都是绑定在端口上面的,所以知道那个客户端请求的)。
accept()方法就会返回请求这个服务的客户端的socket实例。然后通过返回的这个socket实例的方法,操作传输过来的信息。操作方法见2.3~
public
Socket accept ()(阻塞函数,也就是说该方法被调用后,就会等待客户端的请求,直到有一个客户请求连接,才返回socket实例)
Waits for an incoming request and blocks until the connection is opened. This method returns a socket object representing the just opened connection.
Returns
- the connection representing socket.
Throws
IOException
if an error occurs while accepting a new connection. |
2.3、首先明白一点,Socket通信是通过输入输出流来通信的。
Socket提供了getInputStream()和getOutputStream()方法来获取和发送IO流。注:ServerSocket 的实例没有这两种方法。在服务器中通过调用ServerSocket.accept()方法,来获取客户端的socket对象,才能使用这两种方法。
getInputStream()和getOutputStream()方法分别返回InputStream和OutputStream类对象。
2.4、回收资源
虽然系统会自动回收资源,但是还是建议用户自己手动去回收资源。
每个Socket开启时,都会占用系统的资源,当Socket对象操作完毕之后,应该将其关闭。(服务器的socket和客户端的socket都需要关闭)
在关系socket之前,要确保所有的socket输入输出流都已经关闭。
3、简单聊天Demo
该Demo包括服务器和客户端,服务器是编译在计算机的“命令提示符界面”运行的,客户端编译在Android模拟器中运行。然后由Android模拟器与计算机上面的服务器程序聊天通信。(注意:Demo比较简陋,只能执行一次发送操作,如执行多次,就会造成堵塞,可以用多线程去解决,读者可以参考之前的博文,自定义代码就行)
另外,这样通信的话,中文会有乱码,解决方法:编码转码就行,详细过几天再写博文解说
服务器效果图
客户端效果图
3.1、服务器源代码编译于执行方法:
是自己创建一个java文件,然后用命令提示符界面去跳转到java文件的目录下,执行如下命令
编译通过之后执行如下命令运行//SocketServer为服务器的class名字,用户可以自定义
3.2、服务器的源代码如下:
3.3、客户端源代码
客户端为Android的工程
用eclipse编译即可
代码如下
最后记得在Androidmanifest.XML文件加入网络权限
分享到:
相关推荐
Android学习笔记(一)——创建第一个Android项目 Android学习笔记(二)android studio基本控件及布局(实现图片查看器) Android学习笔记(三)android studio中CheckBox自定义样式(更换复选框左侧的勾选图像) ...
Android学习笔记——获取网络图片并显示
Android开发者学习笔记——View、Canvas、bitmap
Android Training学习笔记——Navigation 参考源码,文章地址:http://blog.csdn.net/xroocky/article/details/50804762
之前博文《 Android学习笔记之——Android Studio的安装(3.6版本)、Java的基本语法及Android的概述 》曾经介绍过android有四大组件。本博文学习一下Content Providers(内容提供器) 目录 Android运行时 ...
——————————————————————————————————————————————
Android Training学习笔记——App Bar 参考源码,文章地址:http://blog.csdn.net/xroocky/article/details/50612401
Android Training学习笔记——Navigation 参考源码,文章地址:http://blog.csdn.net/xroocky/article/details/50767844
Android Training学习笔记——Navigation 参考源码,文章地址:http://blog.csdn.net/xroocky/article/details/50767844
Android Training学习笔记——Navigation 参考源码,文章地址:http://blog.csdn.net/xroocky/article/details/50767844
Android开发笔记——模拟器、应用教程 pdf Android开发笔记——模拟器、应用教程 pdf
Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip ...
Android学习笔记(一)——创建第一个Android项目 Android学习笔记(二)android studio基本控件及布局(实现图片查看器) Android学习笔记(三)android studio中CheckBox自定义样式(更换复选框左侧的勾选图像) ...
Python学习笔记——socket通信相关资源文件 内部包括server1 2 3 + windows版 nc
此篇Android学习笔记的源码主要内容: 1.使用WebView控件加载网页 2.使用ImageView控件加载网络图片
Android学习笔记(十)——使用意图链接活动 完整代码
《Spring技术内幕》学习笔记1——IoC容器体系结构 《Spring技术内幕》学习笔记2——IoC定位Bean定义资源 《Spring技术内幕》学习笔记3——IoC容器载入Bean定义资源文件 《Spring技术内幕》学习笔记4——IoC容器...