博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java Socket总结
阅读量:4327 次
发布时间:2019-06-06

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

  • 网络基础
    • TCP/IP协议
      • TCP/IP是目前世界上应用最为广泛的协议,是以TCP和IP为基础的不同层次上多个协议的集合,也称:TCP/IP协议族 或 TCP/IP协议栈
      • TCP:Transmission Control Protocol 传输控制协议
      • IP:Internet Potocol 互联网协议
      • TCP/IP五层模型 (应用层-传输层-网络层-数据链路层-物理层)
        • 应用层
          • HTTP超文本传输协议
          • FTP文件传输协议
          • SMTP简单邮件传送协议
          • Telnet远程登陆服务
    • 端口
      • 用于区分不同应用程序
      • 端口号范围是 0 ~~ 65525,其中 0 ~~ 1023为系统保留
      • IP地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的基础
      • 常用的协议使用的端口号 http:80 ftp:21 telnet:23
    • Java中的网络支持
      针对网络通信的不同层次,Java提供的网络功能有四大类
      • InetAddress(用于标识网络上的硬件资源)
      • URL(统一资源定位符,通过URL可以直接读取或写入网络上的数据)
      • Sockets(使用TCP协议实现网络通信的Socket相关的类)
      • Datagram(使用UDP协议,将数据保存在数据报中,通过网络进行通信)
  • InetAddress类
    • InetAddress类代表了一个网络目标地址,包括主机名和数字类型的地址信息。
    • 该类有两个子类,Inet4Address和Inet6Address,分别对应了目前IP地址的两个版本。InetAddress
    • 实例是不可变的,一旦创建,每个实例就始终指向同一个地址。
    • 可以根据IP获取该对象,根据该对象可以获得对应的主机名等等信息
    • InetAddress也可能会被用来将IP地址转变为这些地址的域名,这对于分析Web日志是很有用的。InetAddress使得开发者们可以轻松的和域名、IP地址打交道,并且使他们可以不必和DNS服务器进行交互。
  • URL(Uniform Resource Locator 统一资源定位符 表示Internet上某一资源的地址)
    • URL由两部分组成:协议名称和资源名称,中间用冒号隔开
    • 在java.net包中,提供了URL类来表示URL
    • 利用一个网址获取该网页内容(爬虫抓取)
      public static void printPage(){        try {            URL url = new URL("http://www.baidu.com");            InputStream is = url.openStream();            InputStreamReader isr = new InputStreamReader(is);            BufferedReader br = new BufferedReader(isr);            String data = br.readLine();            while(data != null){                System.out.println(data);                data = br.readLine();            }            br.close();            isr.close();            is.close();                    } catch (Exception e) {            e.printStackTrace();        }    }}​

       

  • TCP编程( Socket 实现 TCP 编程)
    • Socket通信
      • TCP协议是面向连接、可靠的、有序的,以字节流的方式发送数据
      • 基于TCP协议实现网络通信的类
        • 客户端的Socket类
        • 服务器端的ServerSocket类
      • 实现步骤
        • 创建ServerSocket和Socket
        • 打开连接到Socket的输入/输出流
        • 按照协议对Socket进行读/写操作
        • 关闭输入输出流、关闭Socket
    • Sokect通信模型
      • Server(服务器端)
        public class Service {    public static void main(String[] args) {        try {            ServerSocket serverSocket = new ServerSocket(8888);            Socket socket = serverSocket.accept();            InputStream is = socket.getInputStream();            InputStreamReader isr = new InputStreamReader(is);            BufferedReader br = new BufferedReader(isr);            String info = null;            while((info = br.readLine())!=null){                System.out.println("服务器,客户端请求:"+info);            }            socket.shutdownInput();            br.close();            isr.close();            is.close();            socket.close();        } catch (Exception e) {            e.printStackTrace();        }    }}

         

        • 建立连接
          • 建立服务端监听Socket
          • 等待并接收连接请求
          • 接收请求后创建Socket
        • 开始通道
          • InputStream
          • OutputStream
        • 结束通信
          • 关闭Socket及相关资源
      • Client(客户端)
        public class Client {    public static void main(String[] args) {        try {            Socket socket = new Socket("localhost",8888);            OutputStream os = socket.getOutputStream();            PrintWriter pw = new PrintWriter(os);            pw.write("用户名:admin;密码:admin");            pw.flush();            socket.shutdownOutput();            pw.close();            os.close();        } catch (Exception e) {            e.printStackTrace();        }    }}
        • 创建连接Socket向服务器发送请求
        • OutputStream
        • InputStream
        • 关闭Socket及相关资源
  • UDP编程
    • UDP通信模型
      • 服务端实现步骤
        package org.socket.demo;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;public class UDPService {        public static void main(String[] args) {        try {            /**             * 接收客户端发送过来的数据信息             */            //1.创建服务器端DataramSocket,指定端口号            DatagramSocket datagramSocket = new DatagramSocket(8800);            //2.创建数据报,用于接收客户端发送的数据            byte[] data = new byte[1024];//创建字节数组,指定接收的数据包的大小            DatagramPacket packet = new DatagramPacket(data,data.length);            //3.接收客户端发送的数据            datagramSocket.receive(packet);//此方法在接收到数据报之前会一直阻塞            //读取数据            String info = new String(data,0,packet.getLength());            System.out.println("我是服务器,客户端说:"+info);                        /**             * 回应客户端的信息             */            byte[] data2 = "欢迎您".getBytes();            InetAddress inetAddress = packet.getAddress();            int port = packet.getPort();            DatagramPacket packet2 = new DatagramPacket(data2,data2.length,inetAddress,port);            datagramSocket.send(packet2);                        datagramSocket.close();        } catch (Exception e) {            e.printStackTrace();        }            }}
        • 创建DatagramSocket,指定端口号
        • 创建DatagramPacket,就是创建数据报,用来接收客户端发送的数据
        • 接收客户端发送的数据信息
        • 读取数据
      • 客户端实现步骤
        package org.socket.demo;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;public class UDPClient {    public static void main(String[] args) {        //1.定义服务器的地址、端口号、数据        try {            /**             * 向服务器端发送请求             */            InetAddress address = InetAddress.getByName("localhost");            int port = 8800;            byte[] data = "用户名:admin;密码:123".getBytes();            //2、创建数据报,包含发送的数据信息            DatagramPacket packet = new DatagramPacket(data, data.length, address, port);            //3、创建DatagramSocket对象            DatagramSocket socket = new DatagramSocket();            socket.send(packet);                                    /**             * 接收服务器端发送过来的数据信息             */            byte[] data2 = new byte[1024];//创建字节数组,指定接收的数据包的大小            DatagramPacket packet2 = new DatagramPacket(data2,data2.length);            //3.接收客户端发送的数据            socket.receive(packet2);//此方法在接收到数据报之前会一直阻塞            String info = new String(data2,0,packet2.getLength());            System.out.println("我是客户端,服务器说:"+info);                        socket.close();        } catch (Exception e) {            e.printStackTrace();        }    }}
        • 定义发送信息
        • 创建DatagramPacket,包含将要发送的信息
        • 创建DatagramSocket
        • 发送数据
  • Socket总结
    • 是否关闭输入/输出流
      • 对于同一个Socket,如果关闭了输出流,则与该输出流关联的socket也会被关闭,所以一般不用关闭流,直接关闭Socket即可
    • 多线程的优先级
      • 未设置优先级可能会导致运行时速度非常慢,可降低优先级提高运行速率
    • 使用TCP通信传输对象
      • ObjectOUTputStream, writeObject()---->传输的对象必须实现序列化接口,implements Serializable,否则报异常Socket socket = new Socket("localhost",8888);OutputStream os = socket.getOutputStream();ObjectOutputStream oos = new ObjectOutputStream(os);User user = new User("amdin","123");oos.writeObject(user);socket.shutdownOutput();
      • ObjectInputStream,readObject()InputStream is = socket.getInputStream();ObjectInputStream ois = new ObjectInputStream(is);User user = (User)ois.readObject();System.out.println(user.getUsername()+"\t"+user.getPassword());socket.shutdownInput();
    • soket编程传递文件
  • 资料文献书籍
    • IP地址:《探索Linux的网络世界》

转载于:https://www.cnblogs.com/myfaith-feng/p/9665979.html

你可能感兴趣的文章
《代码大全》学习摘要(五)软件构建中的设计(下)
查看>>
C#检测驱动是否安装的问题
查看>>
web-4. 装饰页面的图像
查看>>
微信测试账户
查看>>
Android ListView上拉获取下一页
查看>>
算法练习题
查看>>
学习使用Django一 安装虚拟环境
查看>>
Hibernate视频学习笔记(8)Lazy策略
查看>>
CSS3 结构性伪类选择器(1)
查看>>
IOS 杂笔-14(被人遗忘的owner)
查看>>
自动测试用工具
查看>>
前端基础之BOM和DOM
查看>>
[T-ARA/筷子兄弟][Little Apple]
查看>>
编译Libgdiplus遇到的问题
查看>>
【NOIP 模拟赛】Evensgn 剪树枝 树形dp
查看>>
java学习笔记④MySql数据库--01/02 database table 数据的增删改
查看>>
两台电脑如何实现共享文件
查看>>
组合模式Composite
查看>>
程序员最想得到的十大证件,你最想得到哪个?
查看>>
我的第一篇CBBLOGS博客
查看>>