当前位置: 首页 > article >正文

socket网络编程-TC/IP方式

网络编程

1.概念:两台设备之间通过网络数据传输。
2.网络通信:将数据通过网络从一台设备传输另外一台设备。
3.java.net包下提供了一系列的类和接口,提供程序员使用,完成网络通信。
在这里插入图片描述

TCP和UDP

TCP协议:
1.使用TCP协议前,需建立TCP连接,形成传输数据通道。
2.传输前,采用“三次握手”方式,是可靠的。
3.TCP协议进行通信的两个应用进程:客户端、服务端。
4.在连接中可进行大数据量的传输。

UDP协议:
1.将数据、源、目的封装成数据包,不需要建立连接
2.每个数据报的大小限制在64Kb内
3.因无需连接,故是不可靠的
4.发送数据结束时无需释放资源,速度快。
5.举例:发短信

介绍java.net中的工具类

在这里插入图片描述

Socket介绍

1.套接字(Socket)开发网络应用程序被广泛,以至于成为事实上的标准。
2.通信额两端都要有Socket,是两台机器通信的端点。
3.网络通信其实是Socket间的通信。
4.Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。
5.一般主动发起通信的应用程序属于客户端,等待通信请求的为服务端。
在这里插入图片描述
当我们需要通讯时(读写数据),客户端和服务端分别使用以下两个方法。
1.socket.getOutputSream()
2.socket.getInputStream()
在这里插入图片描述
Socket有TCP编程和UDP编程。

TCP网络通信编程的案例

要求:
1.编写一个服务器端和客户端。
2.服务器端在9999端口监听。
3.客户端连接到服务器,发送“Hello server”,然后退出。
4.服务器端接受到客户端发送的信息,输出,并退出。

思路

在这里插入图片描述
代码实现,客户端如下:

import java.io.IOException;
import java.io.OutputStream;
import java.net.*;

public class SocketClientTCP01 {

	public static void main(String[] args) {
		
	
		
		try {
			// 思路
			// 1.连接服务端
			// 解读:连接本机的9999,如果连接成功,返回socket对象
			Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
			System.out.print("服务 socket = " + socket.getClass());
			// 2. 连接上后,生成Socket,通过socket.getOutputStream()
			// 得到 和 socket对象关联的输出流对象 
			OutputStream outputStream = socket.getOutputStream();
			// 3.通过输出流,写入数据到据通道
			outputStream.write("hello , server ".getBytes());
			// 4. 关闭流
			outputStream.close();
			socket.close();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

服务端如下:

import java.io.IOException;
import java.io.InputStream;
import java.net.*;
public class SocketServerTCP01 {
	public static void main(String[] args) {
		try {
            // 1.在本机的9999端口监听,等待连接
			//细节:一台主机只能有重复的端口存在
			//细节:ServerSocket可以通过accept()返回多个Socket[多个客户端]
			ServerSocket serverSocket =  new ServerSocket(9999);
			System.out.print("我在9999端口等待监听,等待连接");
            // 2.当没有客户端连接9999端口时,程序会阻塞,等待连接
			//如果有客户端连接,则会返回Socket对象,程序继续
			Socket socket = serverSocket.accept();
			System.out.print("服务端 socket = " + socket.getClass());
            // 3.通过socket.getInputStream(),读取客户端写入到数据通道的数据,显示
			InputStream input = socket.getInputStream();
			// 4.读取IO相关
			byte [] buf = new byte[1024];
			int readLen = 0 ; 
			while((readLen = input.read(buf)) != -1) {
				//根据读取到的实际长度,显示内容
				System.out.print(new String(buf , 0 , readLen));
			}
			input.close();
			socket.close();
				
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

案例,服务端与客户端相互发送
在这里插入图片描述
其中服务端 代码如下:

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

public class SocketTCP02Server {

    public static void main(String[] args) {
        try {
            // 1.在本机的9999端口监听,等待连接
            //细节:一台主机只能有重复的端口存在
            //细节:ServerSocket可以通过accept()返回多个Socket[多个客户端]
            ServerSocket serverSocket =  new ServerSocket(9999);
            System.out.print("我在9999端口等待监听,等待连接 \n");
            // 2.当没有客户端连接9999端口时,程序会阻塞,等待连接
            //如果有客户端连接,则会返回Socket对象,程序继续
            Socket socket = serverSocket.accept();
            System.out.print("服务端 socket = " + socket.getClass() + "\n");
            // 3.通过socket.getInputStream(),读取客户端写入到数据通道的数据,显示
            InputStream input = socket.getInputStream();
            // 4.读取IO相关
            byte [] buf = new byte[1024];
            int readLen = 0 ;
            while((readLen = input.read(buf)) != -1) {
                //根据读取到的实际长度,显示内容
                System.out.print(new String(buf , 0 , readLen));
            }
            // 获取socket相关的输出流
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("hello , client ".getBytes());

            socket.shutdownOutput();
            //关闭资源
            input.close();
            socket.close();
            outputStream.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端程序为:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class SocketTCP02Client {
    public static void main(String[] args) {
        try {
            // 思路
            // 1.连接服务端
            // 解读:连接本机的9999,如果连接成功,返回socket对象
            Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
            System.out.print("服务 socket = " + socket.getClass() + "\n");
            // 2. 连接上后,生成Socket,通过socket.getOutputStream()
            // 得到 和 socket对象关联的输出流对象
            OutputStream outputStream = socket.getOutputStream();
            // 3.通过输出流,写入数据到据通道
            outputStream.write("hello , server ".getBytes());
            //发送结束标志  半双工吗?
            socket.shutdownOutput();
            //4.获取和socket关联的输入流,读取数据(byte),并显示

            InputStream inputStream = socket.getInputStream();

            // 4.读取IO相关
            byte [] buf = new byte[1024];
            int readLen = 0 ;
            while((readLen = inputStream.read(buf)) != -1) {
                //根据读取到的实际长度,显示内容
                System.out.print(new String(buf , 0 , readLen));
            }
            // 5. 关闭流
            inputStream.close();
            outputStream.close();
            socket.close();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}


http://www.kler.cn/a/488038.html

相关文章:

  • MATLAB算法实战应用案例精讲-【数模应用】图像边缘检测(附MATLAB和python代码实现)(二)
  • 新兴的开源 AI Agent 智能体全景技术栈
  • LabVIEW软件Bug的定义与修改
  • Vue3(elementPlus) el-table替换/隐藏行箭头,点击整行展开
  • 针对数据库系统安全的漏洞扫描加固工具【WebSocket + MySQL】
  • vue el-table 数据变化后,高度渲染问题
  • 《解锁数据科学的魔法盒子:JupyterLab 全面解析》
  • 什么是VLAN?
  • eslint.config.js和.eslintrc.js有什么区别
  • flutter 开启了服务并隐藏后如何关闭
  • Jmeter_后置处理beanshell
  • 监控异地组网有哪些方法,含神卓S700设置教程
  • 移远BC28_opencpu方案_pin脚分配
  • 【深度学习基础】线性神经网络 | softmax回归
  • QTcpSocket 如何统计在线时长
  • 数据结构——栈的实现
  • 在idea中配置多个版本的jdk
  • 【机器学习:十二、TensorFlow简介及实现】
  • 【前端知识】手搓微信小程序
  • 【运维】如何检查电脑正常异常和关机日志? 1074正常关机或重启 6006正常关机 41非正常关机 6008异常关机
  • 单片机-直流电机实验
  • 【Maui】动态菜单实现(绑定数据视图)
  • Docker部署Naocs-- 超细教程
  • 【JVM-2】JVM图形化监控工具大全:从入门到精通
  • 青少年编程与数学 02-006 前端开发框架VUE 18课题、逻辑复用
  • qemu模拟磁盘