Socket

Stella981
• 阅读 822

根据之前的经验,应用软件的网络通信无非就是Socket和HTTP,其中Socket又可以用TCP和UDP,HTTP的话就衍生出很多方式,基础的HTTP GET和POST请求,然后就是WebService的SOAP。

在这些方式中,Socket当然是最基础的。因此先从Socket开始。

服务端就不需要过多的说明了,无论采用什么语言什么平台都可以,只要遵循基本的Socket监听模式就行。

实际上Android的Socket开发就是Java的Socket开发,因此学习过Java的开发人员也许觉得并没有什么难度,不过依然有一些不同于PC开发的地方需要注意

首先是说说TCP开发

Socket socket = new Socket("192.168.3.119",7628);//创建Socket实例,并绑定连接远端IP地址和端口
 
OutputStream ops = socket.getOutputStream();//定义一个输出流,来自于Socket输出流
   
byte[] bytes = b.getBytes();
        
ops.write(bytes);//向输出流中写入数据
 
ops.flush();//刷行输出流
 
//至此,在连接成功的情况下,服务端应该就能收到发送过去的流了。
 
 
//接下来是接收服务器发送过来的数据
InputStream ips = socket.getInputStream();//定义输入流,来自于socket的输入流
 
byte[] bytes2 = new byte[20];
 
ips.read(bytes2);//读取输入流数据
   
String str = new String(bytes2);//转换成字符串
 
btn.setText(str);//显示出来(我是现实在button上,当然,这个方法不正规,不过可以让我少放点空间,看上去界面干净点,只要能看到效果就行)
 
socket.close();

务端代码就不多说明了,只要实现了Socket监听和接收,发送就行。这样Android上Tcp的Socket就完成了,很简单。
接下来是UDP的,理论上来说,UDP的实现应该更简单,不过,由于使用模拟器来调试的关系,出了一点小问题,郁闷了很久,另外,Java用UDP Socket对应使用的类是DatagramSocket,与C#不同,c#是在创建Socket的时候制定参数来制定协议类型,先看代码。


DatagramSocket dgs = new DatagramSocket();//建立一个Socket,这个Socket将作为一个发送器,将Socket包发送出去
     
InetAddress inet = InetAddress.getByName("192.168.3.119");//创建一个InetAddress,ip地址为要发动到的远端的服务器IP
     
DatagramPacket dgp = new DatagramPacket("test2".getBytes(), "test2".getBytes().length,inet,7628);//创建一个UDP数据包,数据包包含远端的IP地址及端口
     
dgs.send(dgp);//发送    
    
dgs.close();
     
     
DatagramSocket dgs2 = new DatagramSocket(9997);//创建另一个UDPSocket,
     
DatagramPacket dgp2 = new DatagramPacket(new byte[20],20); //创建一个空报文包
dgs2.receive(dgp2);//接收数据并填充到报文包中
     
String str = new String(dgp2.getData());//获取报文包里的数据并转换成字符串
     
btn.setText(str);//显示获得的数据
     
dgs2.close();//关闭Socket



需要特别注意的地方,在不做端口映射的情况下,UDP可能无法接受到服务器端发送过来的数据,原因是使用eclipse开发的时候,调试程序是用的模拟环境,模拟环境下,接收数据是要做端口映射的,因为模拟环境下,没有自己真实的IP地址和端口,模拟器是使用5554来运行的,发送数据到PC没问题,但是 PC发送到模拟器的时候,需要把本机的端口映射到模拟器上,真机环境不需要,具体操作方式如下
1、运行模拟器
2、打开DOS命令行窗口
    执行:telnet localhost 5554
   5554是模拟器的端口,执行之后会进入android console
3、 在console下执行:
   redir add udp :8000:9000
   其中,第一个端口号是PC的端口,第二个端口号是模拟器端口。
   执行此命令之后,会把PC 8000端口接收到的数据转到模拟器的9000端口,模拟器就能从9000端口接收UDP数据包了
另外,要实现Socket,必须在 AndroidManifest.xml 中加入权限如下



<uses-permission android:name="android.permission.INTERNET" />

文章出处: http://blog.sina.com.cn/s/blog_685790700100xjuo.html
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Python进阶者 Python进阶者
2年前
一文带你了解Python Socket 编程
大家好,我是皮皮。前言Socket又称为套接字,它是所有网络通信的基础。网络通信其实就是进程间的通信,Socket主要是使用IP地址,协议,端口号来标识一个进程。端口号的范围为065535(用户端口号一般大于1024),协议有很多种,一般我们经常用到的就是TCP,IP,UDP。下面我们来详细了解下Socket吧。一、导入Socket模块因为要操作套接字,
Easter79 Easter79
3年前
tcp、http和socket的区别
本文原链接:https://www.jianshu.com/p/88d69454bdde(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.jianshu.com%2Fp%2F88d69454bdde)tcp、http和socket的区别
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
3年前
tcp和socket和http的区别
又一次感觉到大学本科的基础知识没好好学习。估计光顾着泡妞找对象和睡觉了,后悔莫及啊。网络由下往上分为  物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。  通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层,  三者从本质上来说没有可比性,  socket则是对TCP/IP协议的封装
Stella981 Stella981
3年前
Django初识(web框架,django下载安装,http协议)
一web框架的本质及自定义web框架我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响应,按照http协议的请求协议发送请求,服务端按照http协议的响应协议来响应请求,这样的网络通信,我们就
Wesley13 Wesley13
3年前
BIGI行情
BIGI行情实时行情数据源接口socket接入方法1、国际期货、国内期货、外汇、贵金属、现货、期权、股指、数字货币和A股实时行情和历史行情2、推送的有:socket,websocket,http接收,主动请求的有httpget或post方式3、免费调用K线,实时推送K线4、稳定、无延时5、交易所:纽约NYMEX、纽约COME
Stella981 Stella981
3年前
Socket 通讯原理
Socket是什么呢?Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。不过Socket在不同的语境中有不同的含义,如再说TCP连
Stella981 Stella981
3年前
Django学习之路
基础web框架的实现1.纯手撸web框架。  1、手动书写socket代码  2、手动处理http数据socket套接字importsocketserversocket.socket()server.bind(('127.0.0.1',8080))serv
Stella981 Stella981
3年前
Socket与系统调用深度分析
Socket与系统调用深度分析实验环境:Linux5.0.1内核32位系统的MenuOS本文主要解决两个问题用户态如何通过中断进入socket的系统调用socket抽象层如何通过多态的机制,来支持不同的传输层的协议。也就是socket作为父类,TCP/UDP为子类,父类指向子类对象,实现多态