×

androidsocket接收文件

androidsocket接收文件(android socketio)

admin admin 发表于2023-03-29 14:30:18 浏览70 评论0

抢沙发发表评论

本文目录一览:

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 socket收不到数据

如果你可以确定你的功能模块正确的话,那么接收不到数据就是你没有在“AndroidManifest.xml”文件中增加网络权限!

Android手机端通过socket接收蓝牙模块串口发来的字符串,出现字符串被截断现象,求解决办法,万分感谢!

在while循环外部的上方申明:

String sda="";

将while循环里面的 String sda = new String(byte_data);

改为:sda+=new String(byte);

最后将while循环里面的 System.out.println("收到的数据sda为:"+sda);

移到while循环外部的下方。

Android-Socket

由于二者不属于同一层面,所以本来是没有可比性的。但随着发展,默认的Http里封装了下面几层的使用,所以才会出现Socket HTTP协议的对比:(主要是工作方式的不同):

Socket可理解为一种特殊的文件,在服务器和客户端各自维护一个文件,并使用SocketAPI函数对其进行文件操作。在建立连接打开后,可以向各自文件写入内容供对方读取或读取对方内容,通信结束时关闭文件。在UNIX哲学中“一切皆文件”,文件的操作模式基本为“打开-读写-关闭”三大步骤,Socket其实就是这个模式的一个实现。-androidsocket接收文件

创建socket的时候,也可以指定不同的参数创建不同的socket描述符,socket函数的三个参数分别为:

当我们调用socket创建一个socket时,返回的socket描述字它存在于协议族(address family,AF_XXX)空间中,但没有一个具体的地址。如果想要给它赋值一个地址,就必须调用bind()函数,否则就当调用connect()、listen()时系统会自动随机分配一个端口。-androidsocket接收文件

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操作。-androidsocket接收文件

注意:accept的第一个参数为服务器的socket描述字,是服务器开始调用socket()函数生成的,称为监听socket描述字;而accept函数返回的是已连接的socket描述字。一个服务器通常通常仅仅只创建一个监听socket描述字,它在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建了一个已连接socket描述字,当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。-androidsocket接收文件

万事具备只欠东风,至此服务器与客户已经建立好连接了。可以调用网络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返回,至此三次握手完毕,连接建立。-androidsocket接收文件

总结:客户端的connect在三次握手的第二个次返回,而服务器端的accept在三次握手的第三次返回。

某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M;

另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;

一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N;

接收到这个FIN的源发送端TCP对它进行确认。

这样每个方向上都有一个FIN和ACK。

所谓短连接,即连接只保持在数据传输过程,请求发起,连接建立,数据返回,连接关闭。它适用于一些实时数据请求,配合轮询来进行新旧数据的更替。

Android socket通信能发数据但不能接收到数据?

我C#项目中做过同样的Android移动Socket通信。

Android客户端:

SocketClient对象receive函数就调用读取函数,当然之前是打开了Socket连接。

public String receive() throws IOException{

  BufferedReader reader = new BufferedReader(

      new InputStreamReader(client.getInputStream()));

  String txt=reader.readLine();

  return txt;

}

Activity页面使用任务不间断监听接收。

public class SocketReceiveTask extends AsyncTaskVoid, Void, Void{

   @Override

   protected Void doInBackground(Void... arg0) {

   

   SocketClient client = SocketClient.getInstance();

   

   while (true)

   {

      try {

      Thread.sleep(5000);

     

      String re = client.receive();

     

      if (re == null || (re != null  re.equals(""))) {

          continue;

      }

     

      if (isCancelled())

          return null;

 

      //TODO:处理接收到消息 

 

      } catch (SocketException e) {

          //服务端断开,启动重连任务 

          if (e.getMessage().contains("ECONNRESET")){

              reconnectTask = new ReconnectServerTask();

              reconnectTask.execute((Void) null);

          }

          return null;

      } catch (IOException e) {

          e.printStackTrace();

      } catch (InterruptedException e) {

         e.printStackTrace();

      } catch (Exception e){

         e.printStackTrace();

      }

    }

  }

}