第二十一章 网络通信

【自然语言处理】情感分析(一):基于 NLTK 的 Naive Bayes 实现 朴素贝叶斯(Naive Bayes)分类器可以用来确定输入文本属于某一组类别的概率。例如,预测评论是正面的还是负面的。它是 “朴素的”,它假设文本中的单词是独立的(但在现实的自然人类语言中,单词的顺序传达了上下文信息)。尽管有这些假设,但朴素贝叶斯在使用少量训练集预测类别时具有很高的准确性。 阅读详情

网络通信这一章  基本分为三个部分  网络基础概念和TCP,UDP这三个部分主要如下:

计算机网络实现了堕胎计算机间的互联,使得它们彼此之间能够进行数据交流。网络应用程序就是再已连接的不同计算机上运行的程序,这些程序借助于网络协议,相互之间可以交换数据,编写网络应用程序前,首先必须明确网络协议TCP/IP协议是网络应用程序的首选

网络程序设计基础:

网络程序设计编写始于其他计算机进行通信的程序,java已经将网络程序所需要而定元素封装成不同的类,用户只要床啊金这些类的对象,使用相应的方法即使不举报相关的网络知识,也是可以编写除高质量的网络通信程序的,

本章最主要的是TCP和UDP两个部分  他们两主要的区别就是一个是一对一通信  一个是一对多通信   当然两者都有各自的优势和劣势,接下来先讲解 TCP部分
TCP程序

TCP程序的通信方式呢 是一对一的   步骤是  先要打开服务器然后客户端连接服务器  先是尝试客户端是否能够接收到信息  如果可以接收到信息的话  这时服务器将会把文件传输给客户端,这样的话 能够保证客户端可以接收到信息  ,劣势呢就是每次都是要这样子 所以效率对比起UDP来说慢下了好多  以下代码将会进行讲解

客户端代码:


 

package tcp;
 
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
 
/**
 * Socket客户端
 **/
public class SocketClient {
    public static void main(String[] args) {
        Socket s = null;
        try {
            // 与ip为127.0.0.1、端口为12345的服务端建立连接
            s = new Socket("127.0.0.1", 12345);
 
            // 创建输入流接收服务端发送的消息(字节流)
            InputStream is = s.getInputStream();
            // 将服务端返回的字节流转化为字符流
            InputStreamReader isr = new InputStreamReader(is);
            // 创建字符流读取缓冲区,方便每行读取
            BufferedReader br = new BufferedReader(isr);
 
            // 创建输出流返回消息
            OutputStream os = s.getOutputStream();
            // 创建输出流缓冲
            PrintWriter pw = new PrintWriter(os);
 
            // 创建发送消息的线程
            Runnable rOut = () -> {
                boolean flag = true;
                while (flag) {
                    try {
                        // 接收控制台输入
                        Scanner scan = new Scanner(System.in);
                        String msg = scan.nextLine();
                        // 将输入写入缓冲
                        pw.println(msg);
                        // 将缓冲内的数据推送至服务端并清空缓冲区
                        pw.flush();
                    } catch (Exception e) {
                        flag = false;
                        e.printStackTrace();
                    }
                }
            };
 
            // 创建接收消息的线程
            Runnable rIn = () -> {
                boolean flag = true;
                while (flag) {
                    try {
                        // 逐行读取服务端返回的消息并打印
                        String str = br.readLine();
                        System.out.println("服务端的消息:" + str);
                    } catch (IOException e) {
                        flag = false;
                        e.printStackTrace();
                    }
                }
            };
 
            // 启动两个线程
            Thread tOut = new Thread(rOut);
            Thread tIn = new Thread(rIn);
            tOut.start();
            tIn.start();
        }catch (IOException e) {
            try {
                // 释放资源
                s.close();
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            e.printStackTrace();
        }
    }
}

服务端代码:

package tcp;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
 
/**
 * Socket服务端
 **/
public class SocketServer {
    public static void main(String[] args) {
        ServerSocket ss = null;
        Socket s = null;
        try {
            // 创建监听端口为12345的Socket服务端
            ss = new ServerSocket(12345);
            System.out.println("服务端Socket服务已建立,等待客户端连接...");
            // 通过ss.accept()开始持续监听12345端口,当有连接时获取收到的包装成Socket的客户端对象
            s = ss.accept();
            // 获取客户端的IP地址和端口号
            String ip = s.getInetAddress().getHostAddress();
            int port = s.getPort();
            System.out.println("服务端与 " + ip + ":" + port + " 已建立连接");
 
            // 创建输入流接收客户端发送的消息(字节流)
            InputStream is = s.getInputStream();
            // 将客户端发送的字节流转化为字符流
            InputStreamReader isr = new InputStreamReader(is);
            // 创建字符流读取缓冲区,方便每行读取
            BufferedReader br = new BufferedReader(isr);
 
            // 创建输出流返回消息
            OutputStream os = s.getOutputStream();
            // 创建输出流缓冲
            PrintWriter pw = new PrintWriter(os);
 
            // 创建接受信息的线程
            Runnable rIn = () -> {
                boolean flag = true;
                while (flag) {
                    try {
                        // 逐行读取客户端发送的消息并打印
                        String str = br.readLine();
                        System.out.println("客户端的消息:" + str);
                    } catch (IOException e) {
                        flag = false;
                        e.printStackTrace();
                    }
                }
            };
 
            // 创建发送消息的线程
            Runnable rOut = () -> {
                boolean flag = true;
                while (flag) {
                    try {
                        // 接收控制台输入
                        Scanner scan = new Scanner(System.in);
                        String msg = scan.nextLine();
                        // 将输入写入缓冲
                        pw.println(msg);
                        // 将缓冲内的数据推送至客户端并清空缓冲区
                        pw.flush();
                    } catch (Exception e) {
                        flag = false;
                        e.printStackTrace();
                    }
                }
            };
 
            // 开启两个线程
            Thread tIn = new Thread(rIn);
            Thread tOut = new Thread(rOut);
            tIn.start();
            tOut.start();
        } catch (IOException e) {
            try {
                // 释放资源
                ss.close();
                s.close();
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            e.printStackTrace();
        }
    }
}

代码图如下:

运行结果如下所示:

接下来讲解UDP程序

UDP程序

UDP程序跟TCP程序不同的地方呢  TCP通信是一对一通信 如果要一下通知好多个人的话 就需要一个一个来通信  所以这时将会需要UDP了  UDP的优势就在于效率高 但是不稳定的地方呢  就是效率高但是不一定每个人都能看到  就像老师在台上讲课 总有一些学生会在台下玩手机 或者带耳机  不一定每一个人都能够接受得到  这就是UDP的不稳定的地方 ,接下来使用代码来讲解:

广播类代码如下:


 

package udp;
 
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
//广播  先运行
public class Notification  extends Thread{
	String weather = "节目预报:八点有大型晚会,请收听";//发送消息
	int port = 9898;//端口号
	InetAddress iaddress = null;
	MulticastSocket socket = null;//多点广播套接字
	
	Notification(){
		try {
			iaddress = InetAddress.getByName("224.255.10.0");//地址
			socket = new MulticastSocket(port);//实例化多点广播套接字
			socket.setTimeToLive(1);//指定发送范围是本地网络
			socket.joinGroup(iaddress);//加入广播组
		}catch(IOException e){
			e.printStackTrace();//输出异常信息
		}
	
	}
	public void run(){//run方法
		while(true) {
			DatagramPacket packet = null;//数据包
			byte data[]=weather.getBytes();//字符串消息的字节数组
			packet =  new  DatagramPacket(data,data.length,iaddress,port);//将数据打包
			System.out.println(weather);//控制台打印消息
			try {
				socket.send(packet);//发送数据
				sleep(3000);//让线程休眠3000毫秒
			}catch(IOException e){
				e.printStackTrace();
			}catch(InterruptedException e) {
				e.printStackTrace();
			}
		}	
			}
	public static void main(String[]args) {
		Notification w =new Notification();
		w.start();//启动线程
	}
}

接收类代码如下:

package udp;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;
//接收  后运行
public class Receive extends JFrame implements Runnable, ActionListener {
	int port ;//端口
	InetAddress group =null;//广播组地址
	MulticastSocket socket = null;//多点广播套接字对象
	JButton inceBtn = new JButton("开始接收");
	JButton stopBtn = new JButton("停止接收");
	JTextArea inceAr = new JTextArea(10,10);//显示接收广播的文本域
	JTextArea inced = new JTextArea(10,10);
	Thread thread ;
	boolean stop = false;//定制接受信息状态
	
	public Receive () {
		setTitle("广播数据包");
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		thread = new Thread(this);
		inceBtn.addActionListener(this);//绑定按钮ince的单击事件
		stopBtn.addActionListener(this);//绑定按钮stop的单击事件
		inceAr.setForeground(Color.blue);//指定文本域中文字的颜色
		
		JPanel north = new JPanel();
		north.add(inceBtn);//将按钮添加到面板north上
		north.add(stopBtn);
		add(north,BorderLayout.NORTH);//将north放置在窗体的上部
		JPanel center = new JPanel();//创建面板对象center
		center.setLayout(new GridLayout(1,2));//设置面板布局
		center.add(inceAr);//将文本域添加到面板上
		center.add(inced);
		add(center,BorderLayout.CENTER);//设置面板的布局
		validate();//刷新
		port =9898;//设置端口号
		try {
			group = InetAddress.getByName("224.255.10.0");//指定接收地址
			socket = new MulticastSocket(port);//绑定多点广播套接字
			socket.joinGroup(group);//加入广播组
		}catch(IOException e){
			e.printStackTrace();//输出异常信息
		}
		setBounds(100,50,360,380);//设置布局
		setVisible(true);//将窗体设置为显示状态
	}
	public void run() {//run方法
		while (!stop) {
			byte data[] = new byte[1024];//创建缓存字节数组
			DatagramPacket packet = null;
			packet = new  DatagramPacket(data,data.length,group,port);//待接收的数据包
			try {
				socket.receive(packet);//接收数据包
				//获取数据包中的内容
				String message  = new String(packet.getData(),0,packet.getLength());
				inceAr.setText("正在接收的内容:\n"+message);//将接受内容显示在文本域中
				inced.append(message+"\n");//每条信息为一行
			}catch(IOException e ) {
				e.printStackTrace();//输出异常信息
			}
			
		}
	}
	public void actionPerformed(ActionEvent e) {//单机按钮ince出发时间
		if(e.getSource()==inceBtn) {
			inceBtn.setBackground(Color.red);//设置按钮颜色
			stopBtn.setBackground(Color.yellow);
			if(!(thread.isAlive())) {//如线程不处于“新建状态”
				thread = new Thread(this);//实例化Thread对象
			}
			thread.start();//启动线程
			stop = false;//开始接受信息
		}
		if(e.getSource()== stopBtn) {//单机按钮stop出发时间
			inceBtn.setBackground(Color.yellow);//设置按钮亚瑟
			stopBtn.setBackground(Color.red);
			stop = true;//停止接收信息
		}
	}
	public static void main(String[]args) {
		Receive rec = new Receive();
		rec.setSize(460,200);
	}
}

代码图如下所示:

运行结果如下所示:

手把手教你学Simulink--逆变器场景:基于Simulink的单相全桥逆变器PWM控制仿真建模 本文介绍了使用Simulink和Simscape Electrical库进行单相全桥逆变器PWM控制仿真建模的详细步骤。主要内容包括:从创建Simulink项目、添加电力电子组件、构建逆变器模型,到设置参数、运行仿真和结果分析。重点讲解了逆变器核心模块的配置、PWM信号生成、负载建模等关键环节,并提供了优化改进建议。该指南适用于电力电子初学者,通过仿真可以帮助理解单相全桥逆变器的工作原理和PWM控制技术,为实际应用和算法开发提供基础平台。 阅读详情

相关推荐

腾讯2020 unreal虚幻面试题

解析一下,腾讯的unreal客户端面试题: 1.lua性能优化的方向 申请的内存,是造成卡顿的原因之一,在C++与lua交互中,如果参数或者返回值有类变量,那么这个变量不会再交互的栈中存放数据,而会通过申请内存,再指定在交互,这样就造成卡顿,因此可以通过把C++的对象的每个参数分开单独传递,可以解决问题,当时我们游戏改完这个问题后,整体提升了2帧。 其实,主要是Tick循环中,减少与C++的交互,需要的数据不要每帧都去拿,其次,经常拿的一些数据(比方说主角信息),可以做一个lua缓存,...

qq_17347313的博客 1万+

java第二十一章网络通信

由于数据链路层编程和通信与设备紧密关联,网络层编程和操作系统紧密关联。Java网络编程从传输层开始,并根据编程使用协议的层次分为高层次网络编程(基于应用层)和低层次网络编程(基于传输层)。基于URL使用高层次网络编程,基于传输层使用低层次网络编程。

y3068664188的博客 586

Synopsys Sentaurus TCAD新手教程:从零开始仿真trench MOSFET(附完整代码解析)

本文提供Synopsys Sentaurus TCAD新手教程,详细讲解从零开始仿真trench MOSFET的全过程,包括环境搭建、外延生长、沟槽刻蚀、栅极形成等关键步骤,并附完整代码解析。通过实际案例帮助半导体工程师掌握Sprocess操作技巧,优化工艺参数设置,提升仿真效率。

weixin_30505225的博客 217

第二十一章Java网络通信

TCP程序的通信方式呢 是一对一的 步骤是 先要打开服务器然后客户端连接服务器 先是尝试客户端是否能够接收到信息 如果可以接收到信息的话 这时服务器将会把文件传输给客户端,这样的话 能够保证客户端可以接收到信息 ,劣势呢就是每次都是要这样子 所以效率对比起UDP来说慢下了好多 以下代码将会进行讲解。进行通信的程序,java已经将网络程序所需要而定元素封装成不同的类,用户只要床啊金这些类的对象,使用相应的方法即使不举报相关的网络知识,也是可以编写除高质量的网络通信程序的,

2201_75658999的博客 515

BitLocker恢复密钥丢失?从原理到实战的完整解锁与系统重生指南

磁盘加密技术是数据安全的核心防线,它通过对存储设备上的数据进行编码,确保未经授权的用户无法访问。其原理主要基于加密算法(如AES)与密钥管理机制,在操作系统启动前或数据读写时进行实时加解密。这项技术的核心价值在于防止设备丢失或被盗后的数据泄露,尤其对于笔记本电脑和移动设备至关重要。典型的应用场景包括企业办公电脑、存有敏感信息的个人设备以及符合合规性要求的行业。当使用Windows系统自带的BitLocker加密功能时,若因硬件改动、系统更新等触发保护机制,用户可能会面临需要输入恢复密钥才能启动的困境。本文聚

weixin_34006965的博客 489

JW01二氧化碳传感器实战:5分钟搞定Arduino环境监测系统(附完整代码)

本文详细介绍了如何使用JW01二氧化碳传感器与Arduino快速搭建环境监测系统。通过简单的硬件连接和完整的代码示例,读者可以在5分钟内实现CO2浓度实时监测,并了解数据解析、常见问题解决及进阶应用扩展。JW01传感器的高精度和易用性使其成为创客和嵌入式开发者的理想选择。

kite3的博客 382

第二十一章网络通信

中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议,Internet国际互联网络的基础,简单的说,就是由网络层的IP协议和传输层的Tcp协议组成的。2.UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报。3.DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和。4.UDP协议中每个数据报都给出了完整的地址信息,因此无需建立发送方和接收方的连接。

2201_75498015的博客 202

基于STM32的智能快递柜设计(全部资料)

本文设计了一种基于STM32F407ZGT6的智能快递柜系统,通过模块化硬件设计和软件算法优化,实现了24小时无人值守、温湿度智能调控、远程监控等功能。系统集成OLED显示、GSM通信、舵机控制、超声波检测等模块,存取响应时间≤3秒,识别准确率达99.2%,较传统模式效率提升60%。测试表明系统运行稳定,用户满意度达92%,具有成本低、安全性高、可扩展性强等特点,为智慧物流末端配送提供了创新解决方案。未来可引入AI算法、太阳能供电等功能进一步优化系统性能。

3254968421的博客 586

第二十一章——网络通信总结

一般而言,一台计算机只有单一的连到网络的物理连接(Physical Connection),所有的数据都通过此连接对内、对外送达特定的计算机,这就是端口。这种方式就像邮递员送信给收信人,可以寄出很多信给同一个人,且每一封信都是相对独立的,各封信送达的顺序并不重要,收信人接收信件的顺序也不能保证与寄出信件的顺序相同。服务器端与客户端的交互过程如图所示。通常,0~1023的端口数用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用1024以上的端口数,以避免端口号与另一个应用或系统服务所用端口冲突。

hj920885623的博客 1068

结构光之相移法+多频外差的数学原理推导

‍论文:基于数字光栅投影的结构光三维测量技术与系统研究 [博]作者:李中伟 华中科技大学 2007功能:相移法:多频外差(三频N步相移法)01 相移法图1 待写入投影仪的理想N步相移条纹通常对于 步相移来说,生成第 幅条纹图像(如图1所示)的公式如下:402 Payment Required其中::背景光强:调制强度:像素点横向坐标:相移值图2 相机拍摄到的实际 N ......

3D视觉工坊 1189

Allegro如何设置走线自动删除重复走线操作指导

Allegro如何设置走线是自动删除重复走线操作指导在PCB布线的时候,点到点需要重复走一段线的时候,希望原来的线段自动被删除,Allegro设计的时候支持这个操作如下图,重复走中间的线段的时候,希望下方的走线自动删除具体操作如下This section is describe what the function allegro have ,helpfully could let user know more about allegroAllegro Design and Analysis includes

weixin_54787054的博客 4499

第二十一章网络通信总结博客

IP是Internet Protocol的简称,是一种网络协议。一般而言,一台计算机只有单一的连到网络的物理连接(Physical Connection),所有的数据都通过此连接对内、对外送达特定的计算机,这就是端口。这种方式就像邮递员送信给收信人,可以寄出很多信给同一个人,且每一封信都是相对独立的,各封信送达的顺序并不重要,收信人接收信件的顺序也不能保证与寄出信件的顺序相同。利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序,两者的功能和编写方法大不一样。

2301_76549425的博客 969

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

第二十一章网络通信总结

一般而言,一台计算机只有单一的连到网络的物理连接 (Physical Connection),所有的数据都通过此连接对内、对外送达特定的计算机,这就是端口。TCP网络程序设计是指利用 Socket 类编写通信程序利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序,两者的功能和编写方法大不一样。通常,0~1023 的端口数用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用 1024以上的端口数,以避免端口号与另一个应用或系统服务所用端口冲突。

A3141950的博客 1170

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: 第二十章Java博客
下一篇: TCP通信
JOSOD
博客等级 码龄4年 52粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值