博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java学习笔记 --- 网络编程(套接字)
阅读量:6689 次
发布时间:2019-06-25

本文共 4408 字,大约阅读时间需要 14 分钟。

1、Socket通信原理

  Socket套接字概述:
      网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
      通信的两端都有Socket。
      网络通信其实就是Socket间的通信。
      数据在两个Socket间通过IO流传输。
      Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。

  B:图解

    

 

二、UDP传输

    1.发送Send

      创建DatagramSocket, 随机端口号
      创建DatagramPacket, 指定数据, 长度, 地址, 端口
      使用DatagramSocket发送DatagramPacket
      关闭DatagramSocket

    2.接收Receive
      创建DatagramSocket, 指定端口号
      创建DatagramPacket, 指定数组, 长度
      使用DatagramSocket接收DatagramPacket
      关闭DatagramSocket
      从DatagramPacket中获取数据

    3.接收方获取ip和端口号
      String ip = packet.getAddress().getHostAddress();
      int port = packet.getPort();

public class Send {    public static void main(String[] args) throws  Exception {        //键盘输入        Scanner  sc = new Scanner(System.in);                //1、创建DatagramSocket,随机端口号        DatagramSocket scoket = new DatagramSocket();                    //创建传输内容        while(true){            String str = sc.nextLine();            //如果输入"886"则退出            if("886".equals(str)){                break;            }                    //2、创建DataramPacket,指定数据,长度,地址,端口        DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);                //3、使用DatagramSocket发送DatagramPacket        scoket.send(packet);        }        //4、关闭DatagramSocket        scoket.close();    }}-------------------------------------------------------------------------------------public class Receive {    public static void main(String[] args) throws Exception {        //1、创建DatagramSocket,制定端口号        DatagramSocket socket = new DatagramSocket(6666);                //2、创建DatagramPacket,指定数组,长度        DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);                //3、使用DatagramSocket接收DatagramPacket        while(true){            socket.receive(packet); //接收数据            byte[] arr =packet.getData();//获取数据            int len = packet.getLength();//获取有效的直接个数            String ip = packet.getAddress().getHostAddress();//获取ip地址            int port = packet.getPort();//获取端口号            System.out.println(ip+":"+":"+new String(arr,0,len));        }    }}

三、TCP协议传输

    1.客户端
      创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
      调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
      输入流可以读取服务端输出流写出的数据
      输出流可以写出数据到服务端的输入流
    2.服务端
      创建ServerSocket(需要指定端口号)
      调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
      调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
      输入流可以读取客户端输出流写出的数据
      输出流可以写出数据到客户端的输入流

/*.服务端* 创建ServerSocket(需要指定端口号)* 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket* 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流* 输入流可以读取客户端输出流写出的数据* 输出流可以写出数据到客户端的输入流*/public class Server {    public static void main(String[] args) throws IOException {        //1、创建ServerSocket,并指定端口号        ServerSocket server = new ServerSocket(12345);                //2、调用ServerSocket的accept()方法接受一个客户端请求,等到一个Socket        Socket socket = server.accept();                //3、调用Socket的getInputStream()和getOutputStream()方法获取客户端相连的io流         InputStream is = socket.getInputStream();         OutputStream os = socket.getOutputStream();         os.write("百度一下吧".getBytes());//服务器向客户端写出数据                  //读取客户端发过来的数据         byte[] arr =new byte[1024];         int len = is.read(arr);         //将数据转换成字符串并打印         System.out.println(new String(arr,0,len));         //释放资源         socket.close();        }-------------------------------------------------------------------------------------/*.客户端* 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器* 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流* 输入流可以读取服务端输出流写出的数据* 输出流可以写出数据到服务端的输入流*/public class Cilent {    public static void main(String[] args) throws Exception{        //1、创建Socket连接服务器端(要指定Ip地址和端口号)通过ip地址找到对应的服务器        Socket socket = new Socket("127.0.0.1",12345);                //2、调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流        InputStream is =socket.getInputStream();        OutputStream os = socket.getOutputStream();                //3、读取服务器端发过来的数据        byte[]  arr = new byte[1024];        int len = is.read(arr);                //4、将数据转换成字符串打印        System.out.println(new String(arr,0,len));                //向服务器写数据        os.write("是这样敲代码吗".getBytes());                //释放资源        socket.close();    }}

 

转载于:https://www.cnblogs.com/flei/p/6624219.html

你可能感兴趣的文章
SVN Cleanup failed to process the following paths错误的解决
查看>>
使用button的:after伪类选择器内容的跳动
查看>>
Java从小白到入门,Day8,JAVAOO-多态
查看>>
CSS之各种居中
查看>>
poj 2594 Treasure Exploration
查看>>
bzoj千题计划297:bzoj3629: [JLOI2014]聪明的燕姿
查看>>
iOS简单实现毛玻璃效果
查看>>
maven学习(5)-Maven 聚合与继承特性
查看>>
可以设置命令执行的超时时间的脚本
查看>>
SQL server权限管理和备份实例
查看>>
sql server中的用户临时表和全局临时表的区别
查看>>
大整数算法[06] 绝对值加法
查看>>
2018-2019-1 20165325 《信息安全系统设计基础》第五周学习总结
查看>>
Python 列表(list)操作
查看>>
洛谷P1417 烹调方案
查看>>
Bzoj3652 大新闻
查看>>
GridView之数据邦定(HYPERLINK)小技巧与从数据库取汇总参数传值
查看>>
面试问题总结
查看>>
HTML特殊转义字符列表
查看>>
2、NIO--缓冲区(Buffer)
查看>>