/** * Created by 123 on 2018/2/26. * * http通信是“请求——响应”的方式 * socket则是双方连接起来之后进行实时通信 * * TCP/IP * * 使用UDP方式android端和服务器端接收可以看出, * 其实android端和服务器端的发送和接收大庭相径, * 只要端口号正确,相互通信就没有问题。 * TCP使用的是流的方式发送,UDP是以包的形式发送。 */ public class SocketTest { /** * Tcp协议通信 */ protected void connectServerWithTCPSocket(){ Socket socket; try{ //创建socket对象,并且指定服务器端的ip以及端口号 socket=new Socket("192.168.1.32",1989); //创建一个inputStream 用户读取要发送的文件 InputStream inputStream=new FileInputStream("e://a.txt"); //获取socket的outputStream对象用于发送数据 OutputStream outputStream=socket.getOutputStream(); //创建一个byte类型的buffer字节数组,用于存放读取本地文件 byte buffer[]=new byte[4*1024]; int temp=0; //循环读取文件 while ((temp=inputStream.read(buffer))!=-1){ //把数据写入outputStream之中 outputStream.write(buffer,0,temp); } //发送读取的数据到服务端 outputStream.flush(); /** 或创建一个报文,使用BufferedWriter写入,看你的需求 **/ // String socketData = "[2143213;21343fjks;213]"; // BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( // socket.getOutputStream())); // writer.write(socketData.replace("\n", " ") + "\n"); // writer.flush(); /************************************************/ }catch (UnknownHostException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } } /** * 服务器端实现 * */ // public void ServerReceviedByTcp(){ // // // 声明一个ServerSocket对象 // ServerSocket serverSocket = null; // try { // // 创建一个ServerSocket对象,并让这个Socket在1989端口监听 // serverSocket = new ServerSocket(1989); // // 调用ServerSocket的accept()方法,接受客户端所发送的请求, // // 如果客户端没有发送数据,那么该线程就停滞不继续 // Socket socket = serverSocket.accept(); // // 从Socket当中得到InputStream对象 // InputStream inputStream = socket.getInputStream(); // byte buffer[] = new byte[1024 * 4]; // int temp = 0; // // 从InputStream当中读取客户端所发送的数据 // while ((temp = inputStream.read(buffer)) != -1) { // System.out.println(new String(buffer, 0, temp)); // } // serverSocket.close(); // } catch (IOException e) { // e.printStackTrace(); // } // } /**********************************************************/ /** * 使用UDP协议通信 * * 客户端发送数据 * */ private void connectServerWithUDPSocket(){ DatagramSocket socket; try{ //创建DatagramSocket对象并指定一个端口号, //如果客户端需要接收服务器的返回数据, //还需要使用这个端口号来receive //所以端口号很重要 socket=new DatagramSocket(1985); //使用InetAddress(Inet4Address).getByName把IP地址转换为网络地址 InetAddress serverAddress=InetAddress.getByName("192.168.1.32"); //设置要发送的报文 String str="[2143213;21343fjks;213]"; //将字符串转化为字节数组 byte data[]=str.getBytes(); //创建DatagramPacket对象,用于发送数据。 //参数:需要发送的数据,数据长度,服务器网络地址,服务器端口号 DatagramPacket packet=new DatagramPacket(data,data.length,serverAddress,10025); socket.send(packet);//发送数据到服务端 }catch (SocketException e){ e.printStackTrace(); }catch (UnknownHostException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } } /** * 使用UDP协议通信 * * 客户端接受服务器返回的数据 * */ public void ReceiveServerSocketData(){ DatagramSocket socket; try{ //实例化的端口号要和发送时候的一致,否则接收不到数据 socket=new DatagramSocket(1985); byte data[]=new byte[4*1024]; //参数:接受的数据,数据的长度 DatagramPacket packet=new DatagramPacket(data,data.length); socket.receive(packet); //接收到的数据转化为string String result=new String(packet.getData(),packet.getOffset(),packet.getLength()); socket.close();//关闭 }catch (SocketException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } } /** * 使用UDP协议通信 * * 服务器接收客户端 * */ public void ServerReceviedByUdp(){ //创建一个DatagramSocket对象,并指定监听端口。(UDP使用DatagramSocket) DatagramSocket socket; try { socket = new DatagramSocket(10025); //创建一个byte类型的数组,用于存放接收到得数据 byte data[] = new byte[4*1024]; //创建一个DatagramPacket对象,并指定DatagramPacket对象的大小 DatagramPacket packet = new DatagramPacket(data,data.length); //读取接收到得数据 socket.receive(packet); //把客户端发送的数据转换为字符串。 //使用三个参数的String方法。参数一:数据包 参数二:起始位置 参数三:数据包长 String result = new String(packet.getData(),packet.getOffset() ,packet.getLength()); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
【android学习记录】socket的初步学习
最新推荐文章于 2023-06-07 10:52:49 发布