① android Socket 的使用方法
Socket是位于应用层和传输层之间的一个抽象层,把TCP/IP层复杂的操作抽象为几个简单的接口,供应用层调用以实现进程在网络中通信。
Socket分为流式套接字和数据包套接字,分别对应网络传输控制层的TCP协议和UDP协议。TCP协议是一种面向连接的,可靠的,基于字节流的传输层通信协议,它使用三次握手协议建立连接,并且提供了超时重传机制,具有很高的稳定性。UDP协议是一种无连接的协议,且不对数据包进行可靠性保证。
在网络差的情况下,UDP协议数据包丢失会比较严重,但由于其不属于连接型协议,具有资源消耗少,处理速度快的优点,在音频视频等传输时使用UDP协议较多。
这里我们通过socket实现两个进程之间的通信。
3.TestClientSocket
客户端首先就是开启while循环,创建Socket与ServerSocket进行连接,直到建立与ServerSocket的连接;然后同样是获得ServerSocket,通过InputStream读取其内容,通过OutputStream向其写入内容。
4.再打开客户端
客户端开启之后建立与服务端的连接。
连接创建好之后,客户端向服务端发送信息。
在上层,socket基于对相同IP和相同端口的监听实现的。
刘望舒的Android进阶指北。
② android socket编程中,网络如何设置
原则上,对socket的操作(打开/读写)应该在子线程中进行。你放在UI的主线程里操作不对。
另外你都没贴log出穗友来或者说明log里打印的是猜宏槐什么exception,那绝桐样更有针对性。
③ Android - Socket简单使用
ServerSocket类提供如下构造器:
当ServerSocket使用完毕,应使用 close() 方法来关闭此ServerSocket。通常情况下,服务器不应该只接收一个客户端请求,而应该不断接收来自客户端的请求,所以程序可以通过循环,不断调用ServerSocket的accept方法:
Socket 常用构造器
注:上面两个构造器指定远程主机时既可以使用InetAddress来指定,也可以直接使用String对象来指定远程IP。本地主机只有一个IP地址时,使用第一个方法更简单。
在与服务器进行通讯的时候,无法判断远程的服务器是否断开连接。如果使用 OutputStream 发送数据则会影响正常的数据发送(无法区分)。所以就引入了一个心跳机制。
心跳机制实现,使用 Socket.sendUrgentData() 方法发送一个字节流数据(紧急数据)。可以通过判断服务端的 OOBINLINE 属性是否打开,来确定是否断开连接;
setSoTimeout()理解 :设置超时时间;例如:设置为2s,如果阻塞的时间>2s ,那么就会报错。
④ Android 基于UDP的Socket通信
1、连接DatagramSocket的服务端(ip和port):开启异步线程和socket
2、发送数据(DatagramPacket):异步
3、接收数据(DatagramPacket):注意连接状态,异步读取
4、关闭连接:关闭DatagramSocket和对应线程
1、异常:android.os.NetworkOnMainThreadException。 socket需要在线程中使用
2、前后端统一传输或者接收协议 [requestcode size d1 d2 d3 ... ],在解析时候用得到
3、实施监控socket的连接状态,还是用心跳包发过去,然后返回数据,一段时间没有的话则代表socket连接失败。
4、注意receive接收数据后的有效长度(一个是预存的buffer,一个是有效结果buffer)
5、客户端连上去后不知道为何一定要先发送一次,才能接收?
6、UDP不安全,有长度限制64K
2019 (* ̄(oo) ̄) 诸事顺利!
⑤ Android 多个Activity 共用一个socket
想要让多个activity共用一个socket(本文使用bluetoothsocket,TCP通信其实也是一样的,只是socket引入的库不同而已),网上三个方法,这里只是实现了比较简单的一种(application实体类)。
第一步实现socket实体类:
第二步:设置AndroidManifest.xml
加入android:name=".Mysocket"
第三步:在第一次创建链接时对它初始化:
因为我是蓝牙与51单片机进行通信,初始化bluetoothsocket后,再使用((Mysocket)getApplication()).setSocket(socket8051);这句话初始化实体类。
第四步:在其他的activity调用这个socket可以使用
不出意外可以正常运行。
实体类
`hello`
⑥ Android中Socket编程(二)
LocalServerSocket是属于Android系统内置的一个类,属于net包下,类似java中的serversocket类的功能。
这个类比较简单,构造方法有两个:
一般使用第一个即可;
本类中方法只有四个,分别是:
查看LocalServerSocket源码可知:
本类内容比较简单,主要实现方式都在LocalSocketImpl中,下次分析。
内容基本同LocalScoket,主要功能也是通过LocalSocketImpl实现的。
⑦ Android-Socket
由于二者不属于同一层面,所以本来是没有可比性的。但随着发展,默认的Http里封装了下面几层的使用,所以才会出现Socket & HTTP协议的对比:(主要是工作方式的不同):
Socket可理解为一种特殊的文件,在服务器和客户端各自维护一个文件,并使用SocketAPI函数对其进行文件操作。在建立连接打开后,可以向各自文件写入内容供对方读取或读取对方内容,通信结束时关闭文件。在UNIX哲学中“一切皆文件”,文件的操作模式基本为“打开-读写-关闭”三大步骤,Socket其实就是这个模式的一个实现。
创建socket的时候,也可以指定不同的参数创建不同的socket描述符,socket函数的三个参数分别为:
当我们调用socket创建一个socket时,返回的socket描述字它存在于协议族(address family,AF_XXX)空间中,但没有一个具体的地址。如果想要给它赋值一个地址,就必须调用bind()函数,否则就当调用connect()、listen()时系统会自动随机分配一个端口。
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
函数的三个参数分别为:
如果作为一个服务器,在调用socket()、bind()之后就会调用listen()来监听这个socket,如果客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求。
TCP服务器端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址了。TCP客户端依次调用socket()、connect()之后就想TCP服务器发送了一个连接请求。TCP服务器监听到这个请求之后,就会调用accept()函数取接收请求,这样连接就建立好了。之后就可以开始网络I/O操作了,即类同于普通文件的读写I/O操作。
注意:accept的第一个参数为服务器的socket描述字,是服务器开始调用socket()函数生成的,称为监听socket描述字;而accept函数返回的是已连接的socket描述字。一个服务器通常通常仅仅只创建一个监听socket描述字,它在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建了一个已连接socket描述字,当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。
万事具备只欠东风,至此服务器与客户已经建立好连接了。可以调用网络I/O进行读写操作了,即实现了网咯中不同进程之间的通信!网络I/O操作有下面几组:
read()/write()
recv()/send()
readv()/writev()
recvmsg()/sendmsg()
recvfrom()/sendto()
我推荐使用recvmsg()/sendmsg()函数,这两个函数是最通用的I/O函数,实际上可以把上面的其它函数都替换成这两个函数。
从图中可以看出,当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。
总结:客户端的connect在三次握手的第二个次返回,而服务器端的accept在三次握手的第三次返回。
某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M;
另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;
一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N;
接收到这个FIN的源发送端TCP对它进行确认。
这样每个方向上都有一个FIN和ACK。
所谓短连接,即连接只保持在数据传输过程,请求发起,连接建立,数据返回,连接关闭。它适用于一些实时数据请求,配合轮询来进行新旧数据的更替。
https://github.com/nuisanceless/MySocketDemo
https://github.com/xuuhaoo/OkSocket
⑧ Android Socket通信如何设置超时时间
今天太闲了,实在是一个写博客的好日子! 其实关于这个问题可能用到的人不会很多,不过我在这里还是说说。 正常很多人写socket通信时,都会直接通过new socket(IP,PORT)直接去链接服务器。其实这种做法也没岩蔽纯有错误,但是若当服务并耐器IP不存在会服务器没有响应时,程序会卡在这句代码老长一段时间,才会跳出并报异常粗咐。这对于这种问题,通过设置连接超时时间可以进行解决: socket = new Socket(); SocketAddresssocAddress = new InetSocketAddress(this.netAdress, this.port); 5000就是你所设置的超时时间!