实现android基于TCP/IP协议的通信

1、Android端(客户端)代码:

//TCP向服务端发送数据public void TCP_sendMsg(String msg) {Socket socket = null;OutputStream output = null;InputStream input = null;try {// socket = new Socket(InetAddress.getByName("192.168.1.100"), 8888);//这种形式也行socket = new Socket("192.168.1.100", 8888);// 第一个参数是目标主机名或目标主机的ip地址,第二个参数是目标主机端口号output = socket.getOutputStream();output.write(msg.getBytes());// 把msg信息写入输出流中//--------接收服务端的返回信息-------------socket.shutdownOutput(); // 一定要加上这句,否则收不到来自服务器端的消息返回 ,意思就是结束msg信息的写入input = socket.getInputStream();byte[] b = new byte[1024];int len = -1;sb = new StringBuffer();while ((len = input.read(b)) != -1) {sb.append(new String(b, 0, len, Charset.forName("gbk")));// 得到返回信息}// 在主线程中更新UIrunOnUiThread(new Runnable() {@Overridepublic void run() {mTextView.setText(sb.toString());// 将返回信息设置到界面显示}});} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {// 注意,输出流不需要关闭,因为它只是在Socket中得到输出流对象,并没有创建if (socket != null) {socket.close();// 释放资源,关闭这个Socket}} catch (IOException e) {e.printStackTrace();}}}

TCP_Send.java 来自CODE的代码片

 

 

 

2、服务端代码:

public void ReceiveMsg() {ServerSocket server = null;Socket socket = null;try {server = new ServerSocket(8888);// 创建一个ServerSocket对象,并让这个Socket在8080端口监听// 调用ServerSocket的accept()方法,接受客户端所发送的请求,同时创建一个Socket对象// 如果客户端没有发送数据,那么该线程就停滞不继续,也就是阻塞while(true){socket = server.accept();System.out.println(socket.getInetAddress().getHostName());System.out.println(socket.getInetAddress().getHostAddress());//得到当前发送数据Socket对象的主机名和ip地址InputStream input = socket.getInputStream();// 得到该Socket对象的输入流BufferedInputStream bis = new BufferedInputStream(input);byte[] b = new byte[1024];int len = -1;while ((len = bis.read(b)) != -1) {// 从InputStream当中读取客户端所发送的数据System.out.println(new String(b, 0, len,"UTF-8"));}//--------向客户端的返回信息-------------socket.shutdownInput();//结束读取OutputStream outputResult = socket.getOutputStream();//不需要关闭outputResult.write("ok,我已经收到!".getBytes());bis.close();//关闭缓存输入流,注意,输入流input不需要关闭,因为它只是在Socket中得到输入流对象,并没有创建socket.close();//接收这个Socket的数据后释放资源,因为每一次客户端发送数据都会在服务端创建一个Socket对象,注意ServerSocket不应该关闭,因为这是服务器ServerSocket对象,关闭了客户端就不能发送数据了socket = null;}} catch (IOException e) {e.printStackTrace();}}

 来自CODE的代码片

TCP_Receive.java

 

 

再贴出结果吧:

服务器显示:

192.168.1.102
192.168.1.102
HelloKitty,Java,哈哈哈

 

【总结】基于Socket流式网络编程,也即使用TCP/IP协议,可以对文件的传输进行操作

实现android基于UDP协议的通信

1、Android端(客户端)代码:

//发送数据包给服务端和接收返回的数据public void UDP_send(String msg) {DatagramSocket socket = null;try {socket = new DatagramSocket(8880);// 创建DatagramSocket对象并绑定一个本地端口号,注意,如果客户端需要接收服务器的返回数据,还需要使用这个端口号来接收数据,所以一定要记住byte[] data = msg.getBytes();// 把字符串转为字节数组// Inet4Address inetAddress = (Inet4Address)Inet4Address.getByName("192.168.1.100");//使用这个也行,表示使用4个字节的ip地址InetAddress inetAddress = InetAddress.getByName("192.168.1.100");// 得到ip或主机名为192.168.1.100的网络地址对象DatagramPacket pack = new DatagramPacket(data, data.length,inetAddress, 8881);// 参数分别为:发送数据的字节数组对象、数据的长度、目标主机的网络地址、目标主机端口号,发送数据时一定要指定接收方的网络地址和端口号socket.send(pack);//发送数据包//-----------接收服务器返回的数据-------------byte[] b = new byte[4*1024];//创建一个byte类型的数组,用于存放接收到得数据DatagramPacket pack2 = new DatagramPacket(b, b.length);// 定义一个DatagramPacket对象用来存储接收的数据包,并指定大小和长度socket.receive(pack2);//接收数据包// data.getData()是得到接收到的数据的字节数组对象,0为起始位置,pack.getLength()得到数据的长度final String result = new String(pack2.getData(),0,pack2.getLength(), "gbk");//把返回的数据转换为字符串socket.close();//释放资源//在线程中更新UIrunOnUiThread(new Runnable() {@Overridepublic void run() {mTextView1.setText(result);}});} catch (SocketException e) {e.printStackTrace();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

UDP_Send 来自CODE的代码片

2、服务端代码:

public void ReceiveMsg(){DatagramSocket socket = null;try {socket = new DatagramSocket(8881);// 创建DatagramSocket对象并绑定一个本地端口号while(true){byte[] buf = new byte[4*1024];//创建一个byte类型的数组,用于存放接收到得数据DatagramPacket pack = new DatagramPacket(buf, buf.length);//创建一个DatagramPacket对象,并指定DatagramPacket对象的大小和长度socket.receive(pack);//读取接收到得数据 包,如果客户端没有发送数据包,那么该线程就停滞不继续,这个同样也是阻塞式的String str = new String(pack.getData(), 0,pack.getLength(),"UTF-8");//将接收到的数据包转为字符串输出显示String ip = pack.getAddress().getHostAddress();//得到发送数据包的主机的ip地址System.out.println(ip+"发送:"+str);//-----------返回数据给客户端------------InetAddress address = pack.getAddress();//得到发送数据包主机的网络地址对象byte[] data = "已收到!".getBytes();DatagramPacket p = new DatagramPacket(data, data.length, address, 8880);socket.send(p);}//注意不需要关闭服务器的socket,因为它一直等待接收数据} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

UDP_Receive 来自CODE的代码片

客户端图片:

服务器显示:

192.168.1.102发送:HelloKitty,Java,哈哈哈,这是udp

【注】udp的多播还没实现,实现后我会加上来的

好了,这样就实现了基本的Socket网络编程了,注意:在android端使用时还需要加入权限哦:

 

[java] view plaincopyprint?

  1.       
  2. "android.permission.CHANGE_NETWORK_STATE"/>      
  3.       
  4.       
  5. "android.permission.CHANGE_WIFI_STATE"/>      
  6.       
  7.       
  8. "android.permission.ACCESS_NETWORK_STATE"/>      
  9.       
  10.       
  11. "android.permission.ACCESS_WIFI_STATE"/>      
  12.       
  13.       
  14. "android.permission.INTERNET"/>   


总结:使用UDP方式android端和服务器端接收可以看出,客户端和服务端的发送和接收大庭相径,只要端口号和目标主机ip地址正确了,相互通信就没有问题,而且UDP它们之间的通信是不需要连接的,因为它不管服务端开启准备接收数据包没,它只管把数据包发出去了就行。而TCP就不一样了,如果在服务器没有开启的情况下,它会报一个错,提示与服务端没有建立连接。TCP使用的是流的方式发送,UDP是以包的形式发送。

更多相关文章

  1. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. python起点网月票榜字体反爬案例
  3. android之HttpURLConnection
  4. android 中调用接口发送短信
  5. android全局处理非捕捉异常
  6. Android(安卓)中数据库查询方法 query() 中的参数
  7. Android(安卓)系统应用调用,intent 的使用方法总结
  8. Android(安卓)初步
  9. [Android]豆瓣FM离线数据

随机推荐

  1. 获取网络信息,ip,子网掩码,网关,dns
  2. Android中使用achartengine生成图表
  3. Android(安卓)实现RippleEffect水波纹效
  4. 天天记录 - Android抓包 - 抓取HTTP,TCP协
  5. 【Android(安卓)初学】4、RadioButton &
  6. Android(安卓)自定义加载框dialog
  7. Android(安卓)- 收藏集
  8. Android(安卓)ApiDemos示例解析(194):Vie
  9. android下的回调方法
  10. 那些年不错的Android开源项目-工具篇