Socket和TCP网络通信编程

举报
荞慧子 发表于 2022/12/31 19:52:33 2022/12/31
【摘要】 Socket介绍(1)套接字(Socket)开发网络应用程序被广泛采用,以至于成为事实上的标准。(2)通信的两端都要有Socket,是两台机器间通信的端点。(3)网络通信其实就是Socket间的通信。(4)Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输(5)一般主动发起通信的应用程序属于客户端,等待通信请求的为服务端。TCP网络通信编程介绍(1)基于客户端——...

Socket

介绍

(1)套接字(Socket)开发网络应用程序被广泛采用,以至于成为事实上的标准。

(2)通信的两端都要有Socket,是两台机器间通信的端点。

(3)网络通信其实就是Socket间的通信。

(4)Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输

(5)一般主动发起通信的应用程序属于客户端,等待通信请求的为服务端。

TCP网络通信编程

介绍

(1)基于客户端——服务端的网络通信

(2)底层使用的是TCP/IP协议

(3)应用场景举例:客户端发送数据,服务端接收并显示在控制台

(4)基于Socket的TCP编程

应用案例 1(使用字节流)

(1)编写一个服务器端,和一个客户端

(2)服务器端在9999端口监听

(3)客户端连接到服务器端,发送“hello,server”,然后退出

(4)服务器端接收到客户端发送的信息,输出,并退出


import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketTCP01Server {
    public static void main(String[] args) throws IOException {

        //1. 在本机 的 9999 端口监听, 等待连接
        // 细节: 要求在本机没有其它服务在监听 9999
        // 细节:这个 ServerSocket 可以通过 accept() 返回多个 Socket[多个客户端连接服务器的并发]
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务端,在 9999 端口监听,等待连接..");
        
        //2. 当没有客户端连接 9999 端口时,程序会 阻塞, 等待连接
        // 如果有客户端连接,则会返回 Socket 对象,程序继续
        Socket socket = serverSocket.accept();
        System.out.println("服务端 socket =" + socket.getClass());
        
        //3. 通过 socket.getInputStream() 读取客户端写入到数据通道的数据, 显示
        InputStream inputStream = socket.getInputStream();
        
        //4. IO 读取
        byte[] buf = new byte[1024];
        int readLen = 0;
        while ((readLen = inputStream.read(buf)) != -1) {
        System.out.println(new String(buf, 0, readLen));//根据读取到的实际长度,显示内容. }
        
        //5.关闭流和 socket
        inputStream.close();
        socket.close();
        serverSocket.close();//关闭
    }
}

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class SocketTCP01Client {
    public static void main(String[] args) throws IOException {
        
        //1. 连接服务端 (ip , 端口)
        //解读: 连接本机的 9999 端口, 如果连接成功,返回 Socket 对象
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("客户端 socket 返回=" + socket.getClass());
        
        //2. 连接上后,生成 Socket, 通过 socket.getOutputStream()
        // 得到 和 socket 对象关联的输出流对象
        OutputStream outputStream = socket.getOutputStream();
        
        //3. 通过输出流,写入数据到 数据通道
        outputStream.write("hello, server".getBytes());
        
        //4. 关闭流对象和 socket, 必须关闭
        outputStream.close();
        socket.close();
        System.out.println("客户端退出.....");
    }
}

netstat指令

(1)netstat-an可以查看当前主机网络情况,包括端口监听情况和网络连接情况

(2)netstat-an | more可以分页显示

(3)要求在dos控制台下执行win+f

说明:

1)Listening表示某个端口在监听

2)如果有一个外部程序(客户端)连接到该端口,就会显示一条连接信息

3)可以输入ctrl+c退出指令

UDP网络通信编程

介绍

(1)类DatagramSocket和DatagramPacket[数据包/数据报]实现了基于UDP协议网络程序。

(2)UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。

(3)DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。

(4)UDP协议中每个数据报都给出了完整的地址信息,因此无需建立发送方和接收方的连接。

基本流程

(1)核心的两个类/对象DatagramSocket和DatagramPacket

(2)建立发送端,接收端(没有服务端和客户端概念)

(3)发送数据前,建立数据包/报 DatagramPacket对象

(4)调用DatagramSocket的发送、接收方法

(5)关闭DatagramSocket


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。