Java Socket 套接字编程

作者: 聪明的奇瑞 | 来源:发表于2018-03-05 17:35 被阅读133次

IP 地址+端口号组成了 Socket,Socket 是网络上运行的程序之间双向通信链路的终点,是 TCP 和 UDP 的基础,网络通信其实就是 Socket 间的通信,数据在两个 Socket 间通过 IO 传输

InetAddress

  • 用于标识网络上的硬件资源
//获取本机的InetAddress实例
InetAddress address = InetAddress.getLocalHost();
//获取计算机名
address.getHostName();
//获取IP地址
address.getHostAddress();
//获取字节数组形式的 IP 地址,以点分隔的四部分
byte[] bytes = address.getAddress();
//获取其他主机的 InetAddress 实例
InetAddress address3 = InetAddress.getByName("127.0.0.1");

URL

  • 统一资源定位符,通过URL可以直接读取或写入网络的数据资源
//创建一个 URL 的实例
URL baidu = new URL("http://www.baidu.com");
URL url = new URL(baidu, "/index.html?username=tom#test");//?表示参数,#表示锚点
url.getProtocol();//获取协议
url.getHost();//获取主机
url.getPort();//如果没有指定端口号,根据协议不同使用默认端口。此时getPort()方法的返回值为 -1
url.getPath();//获取文件路径
url.getFile();//文件名,包括文件路径+参数
url.getRef();//相对路径,就是锚点,即#号后面的内容
url.getQuery();//查询字符串,即参数
  • 通过 URL 对象的 openStream() 方法可以得到指定资源的输入流,通过流能够读取或访问网页上的资源
URL baidu = new URL("http://www.baidu.com");
InputStream is = baidu.openStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String content = null;
while ((content = br.readLine()) != null) {
    System.out.println(content);
}
br.close();
is.close();

TCP 编程

  • TCP 协议是面向连接、可靠的、有序的、以字节流的方式发送数据,基于 TCP 协议实现的网络通信,通信模型流程如下
TCP通信流程

客户端 Socket

  • 客户端的 Socket 类,需指明要连接的服务器地址和端口号,建立连接后通过输入、输出流发送和响应信息
public class Client {
    public static void main(String[] args) {
        try (Socket socket = new Socket("127.0.0.1",8999)){
            // 像服务器端发送信息
            OutputStream os = socket.getOutputStream();
            PrintWriter pw = new PrintWriter(os);
            pw.write("我是客户端 linyuan");
            pw.flush();
            // 接收服务器端消息
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String message = null;
            while ((message = br.readLine()) != null) {
                System.out.println("服务器说:" + message);
            }
            // 关闭资源.....
            pw.close();
            os.close();
            is.close();
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务器端 ServerSocket

  • 创建服务器端 ServerSocket 并绑定端口,通过 accept() 方法监听客户端请求,建立连接后通过输入、输出流发送和响应信息
public class Server {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(8999)) {
            System.out.println("服务器启动................");
            while (true) {
                // 监听客户端连接
                Socket socket = serverSocket.accept();
                // 接收客户端消息
                InputStream is = socket.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                String message;
                while ((message = br.readLine()) != null) {
                    System.out.println("客户端说:" + message);
                }
                // 向客户端发送消息
                OutputStream os = socket.getOutputStream();
                PrintWriter pw = new PrintWriter(os);
                pw.write("欢迎加入 xxx 服务器.........");
                pw.flush();
                // 关闭资源.....
                br.close();
                is.close();
                pw.close();
                os.close();
                socket.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

UDP 编程

  • UDP 协议(用户数据报协议)是无连接的、不可靠的、无序的,速度快
  • 进行数据传输时,首先将要传输的数据定义成数据报(DatagramPacket),大小限制在 64k,并指名要发送的地址 Socket(主机地址和端口号),然后再将数据报发送出去

服务器端实现

  • 创建 DatagramSocket 并绑定端口,创建 DatagramPacket 并调用 receive 方法接收客户端发送的数据报(该方法会阻塞到接收到数据报为止),读取数据
public class Server {
    public static void main(String[] args) {
        try{
            byte[] data = new byte[1024];
            // 接收客户端数据报
            DatagramSocket socket = new DatagramSocket(10000);
            DatagramPacket rPacket = new DatagramPacket(data,0,data.length);
            socket.receive(rPacket);
            String info = new String(data,0,rPacket.getLength());
            System.out.println("客户端发送内容:"+info);
            // 响应客户端
            InetSocketAddress socketAddress = new InetSocketAddress(rPacket.getAddress(),rPacket.getPort());
            data = "新的一天!".getBytes();
            DatagramPacket sPacket = new DatagramPacket(data,0,data.length,socketAddress);
            socket.send(sPacket);
            socket.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

客户端实现

  • 定义要发送的消息,创建 DatagramPacket,通过 DatagramSocket 发送数据
public class Client {
    public static void main(String[] args) {
        try{
            InetSocketAddress socketAddress = new InetSocketAddress("localhost",10000);
            byte[] data = "我是客户端".getBytes();
            DatagramPacket packet = new DatagramPacket(data,0,data.length,socketAddress);
            DatagramSocket socket = new DatagramSocket();
            socket.send(packet);    
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

相关文章

  • java 网络编程,Socket编程

    Java的网络编程主要涉及到的内容是Socket编程,那么什么是Socket呢?简单地说,Socket,套接字,就...

  • 2018-09-12 Day18 网络基础

    01.socket编程 socket又叫套接字,就是进行数据通信两端。分为服务端套接字和客户端套接字。套接字编程:...

  • 2018-09-12 day18-网络基础

    总结 一.socket编程 socket又叫套接字,就是进行数据通信两端,分为服务端套接字和客户端套接字套接字编程...

  • 18总 网络基础

    1.socket编程: socket又叫套接字,就是进行数据通信两端。分为服务端套接字和客户端套接字套接字编程:自...

  • 2018-09-12 day18网络基础总结

    一socket编程 socket又叫套接字,就是进行数据通信两端。分为服务端套接字和客户端套接字套接字编程:自己写...

  • 2018-09-12-总结

    一、socket编程 socket又叫套接字,就是进行数据通信的两端。分为服务端套接字和客户端套接字套接字编程:自...

  • 《Netty实战》读书笔记01——第一章

    第 1 章 笔记 Java 网络编程 早期Java的网络编程,需要学习很多C语言套接字(Socket)的知识,但...

  • 2018-09-12 day18网络编程

    1.socket套接字 socket又叫套接字,就是进行数据通信两端。分为服务端套接字和客户端套接字 套接字编程:...

  • python网络编程基础

    1.socket编程 socket又叫套接字socket编程其实就是用代码来实现进行网络通讯的两个端;套接字就是实...

  • Java Socket 套接字编程

    IP 地址+端口号组成了 Socket,Socket 是网络上运行的程序之间双向通信链路的终点,是 TCP 和 U...

网友评论

    本文标题:Java Socket 套接字编程

    本文链接:https://www.haomeiwen.com/subject/dzwhfftx.html