`

TCP通信与UDP通信

阅读更多

      TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,只能用于点对点的通讯。TCP提供的是一种可靠的数据流服务,采用差错重传技术来实现传输的可靠性。TCP还进行流量控制,从而限制了发送方的发送速度。封好的TCP数据包将向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送,设备驱动程序和物理介质,最后到接收方。是一个不断打包,包上加包,再不断拆包,一层接一层的拆解。类似,我们邮寄的包裹,通常都是一层一层的加包,对方收到时再一层一层的拆包。包上写有相应层次的地址信息。

注:所谓“三次握手”是指通过TCP客户机与服务器建立联系时,为了达到安全传输数据和确保连接而进行的三次同步作用的包。第一次发送一个同步消息,对方收到后加上一个确认消息发回同步消息,收到后也发送一个确认消息和同步消息的包。之后可以安全地发送数据了。


      UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,广播发送消息。由于不需要接收方确认,属于不可靠的传输,可能会出现数据丢失的现象。UDP不保证数据包的顺序、错误检测或重发。由于不像TCP有三次握手的初始化连接,很容易被欺骗,而使得数据被截获。

TCP通信流程:
1、创建服务器对象
2、创建套接字
3、得到连接对象
4、取得输入输出流
5、读写数据
UDP通信流程:
1、创建本地地址对象
2、创建套接字
3、创建连接过程
4、创建发送\接收数据包对象
5、读写数据


注:两者在创建套接字时,TCP和UDP创建的都是Socket对象,UDP传入的是本地地址,而TCP传入的是服务器地址。TCP的连接过程,要服务器不断监听指定端口,accept等待客户端接入(accept是阻塞的),客户端根据服务器端的地址,connect请求建立连接,之后就可以通信了。而UDP的连接则简单些,服务器端和本地地址绑定,客户端再和服务器端地址绑定,就可以通信了。

 

我的TCP的例子:

import java.net.Socket;

import javax.swing.JTextArea;
import javax.swing.JTextField;

public class clientTread extends Thread {
	private Socket sli;
	private clientUI cli;
	private java.io.OutputStream ous;
	private JTextField jtf;
	private JTextArea jta;
	public static String name = "client";
	private String h;

	public clientTread(Socket sli, clientUI cli, JTextField jtf, JTextArea jta) {
		this.cli = cli;
		this.sli = sli;
		this.jta = jta;
		this.jtf = jtf;
	}


	public void run() {
		try {
			// 得到输入输出流
			java.io.InputStream ins = sli.getInputStream();
			ous = sli.getOutputStream();
			// 读取服务器传入的提示字符
			String inputs = this.serverRead(ins);
			jta.append("服务器说:" + inputs + "\n");
			while (!cli.endkey) {
				if (cli.haveName) {
					inputs = this.serverRead(ins);
				} else {
					System.out.println("name:" + name);					
					// 读写数据
					inputs = this.serverRead(ins);
					while (!inputs.equals(null) && (!inputs.equals("end#"))) {
						// 客户端读入(字符串式读入)
						h = "服务器" + " says:" + inputs;
						System.out.println("从服务器读了" + h);
						if (!h.equals("#")) {
							jta.append(h + "\n");
						}
						inputs = this.serverRead(ins);
					}
					h = "结束会话" + "\r\n";
					// 写出字符
					cli.sendkey = true;
					this.sendMessage(h);
					jta.append(h + "\n");
					// 客户端关闭
					sli.close();
					System.out.println("ins closed!");
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 客户端读入字节,以字符串形式输出
	 * 
	 * @param ins
	 *            传入输入流
	 * @return 返回客户端发送的字符串
	 */
	public String serverRead(java.io.InputStream ins) {
		try {
			// 创建一个字符串缓冲区
			java.lang.StringBuffer input = new java.lang.StringBuffer();
			int t = 0;
			while (t != 13 && (t != 35)) {
				t = ins.read();
				char c = (char) t;
				input.append(c);// 将读入的字符放入到字符串缓冲区
			}
			String temp = input.toString().trim();
			return temp;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}

	// 写出字符串的方法
	public void sendMessage(String msg) {
		try {			
			if (cli.sendkey) {
				ous.write((msg + "#").getBytes());				
			}			
			// 强制输出
			ous.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
 
  /**
   * 客户端开启并连接服务器
   * @param ip 服务器ip地址
   * @param port  服务器端口号
   */
	public void clintCreat(String ip,int port,JTextField jtf,JTextArea jta){
    		try {	
 			java.net.Socket sli=new java.net.Socket(ip,port);
    	    System.out.println("Hold on>>>>>>>>>>>>");
    		//开启一个线程用于处理
    	    clientc=new clientTread(sli,this,jtf,jta);
    		clientc.start();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
}

 服务器端:

package telnet3;

import java.io.IOException;

public class serverCreat{
public static void main(String[] args){
	serverCreat ccreate=new serverCreat(9090);
}
public serverCreat(int port){
	try {	
		//创建服务器对象
		//int port=90;
		java.net.ServerSocket clint=new java.net.ServerSocket(port);
		System.out.println("Create a Server successfully!");
		while(true){
		//监听,待机状态
		java.net.Socket cli=clint.accept();//得到连接请求的对象		
		//开启一个线程用于处理
		serverC serverc=new serverC(cli);
		serverc.start();
	        //关闭服务器
                //clint.close();
		}
		
		
	} catch (Exception e) {
		e.printStackTrace();
	}
}
}
 
import java.net.ServerSocket;
import java.net.Socket;

import com.sun.corba.se.spi.orbutil.fsm.Input;

public class serverC extends Thread {
	Socket cli;
	private java.io.OutputStream ous;

	public serverC(Socket cli) {
		this.cli = cli;
	}

	public void run() {
		try {
			// 得到输入输出流
			java.io.InputStream ins = cli.getInputStream();
			ous = cli.getOutputStream();
			this.sendMessage("May I have your name,please?");
			System.out.println("eeeeeeeee");
			String name = this.serverRead(ins);
			System.out.println("client's name is:" + name);
			//读写数据
			String h = "Welcome!" + name;
			this.sendMessage(h);
			System.out.println(h);
			String inputs = this.serverRead(ins);
			// 服务器读入(字符串式读入)
			while (!inputs.equals("end#")) {// 当输入的不是end#时,继续读				
				h = /*name + " says:" +*/ inputs;			
				this.sendMessage(h);
				inputs = serverRead(ins);
			}
			// 当输入send#时
			h = "结束会话" + "\r\n";
			// 写出字符
			this.sendMessage(h);
			System.out.println(h);
			// 客户端关闭
			cli.close();
			System.out.println("ins closed!");
			// 客户端关闭socket
			// cli.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 服务器读入字节,以字符串形式输出
	 * 
	 * @param ins
	 *            传入输入流
	 * @return 返回客户端发送的字符串
	 */
	public String serverRead(java.io.InputStream ins) {
		try {
			// 创建一个字符串缓冲区
			java.lang.StringBuffer input = new java.lang.StringBuffer();
			int t = 0;
			while (t != 13 && (t != 35)) {				
				t = ins.read();
				char c = (char) t;
				System.out.print("c:" + c + "   ");
				input.append(c);// 将读入的字符放入到字符串缓冲区				
			}
			 System.out.println("读入"+input.toString());
			return input.toString().trim();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}

	// 写出字符串的方法
	public void sendMessage(String msg) {
		try {
			ous.write((msg + "#").getBytes());
			// 强制输出
			ous.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
 

 

分享到:
评论

相关推荐

    基于纯verilogFPGA的双线性差值视频缩放 功能:利用双线性差值算法,pc端HDMI输入视频缩小或放大,然后再通过HDMI输出显示,可以任意缩放 缩放模块仅含有ddr ip,手写了 ram,f

    基于纯verilogFPGA的双线性差值视频缩放 功能:利用双线性差值算法,pc端HDMI输入视频缩小或放大,然后再通过HDMI输出显示,可以任意缩放。 缩放模块仅含有ddr ip,手写了 ram,fifo 代码,可以较为轻松地移植到其他平台。 硬件平台:易灵思 ti60f225 EDA平台:efinity

    【java毕业设计】智慧社区智慧社区管理员密码修改与重置系统(源代码+论文+PPT模板).zip

    zip里包含源码+论文+PPT,有java环境就可以运行起来 ,功能说明: 文档开篇阐述了随着计算机技术、通信技术和网络技术的快速发展,智慧社区门户网站的建设成为了可能,并被视为21世纪信息产业的主要发展方向之一 强调了网络信息管理技术、数字化处理技术和数字式信息资源建设在国际竞争中的重要性。 指出了智慧社区门户网站系统的编程语言为Java,数据库为MYSQL,并实现了新闻资讯、社区共享、在线影院等功能。 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。

    基于51单片机的一个智能密码锁设计.7z

    基于51单片机的一个智能密码锁设计.7z

    《STM32单片机+2x180-SG90+2x360-SG90+OLED屏幕》源代码

    《基于STM32的舵机控制系统设计》毕业设计项目 1.STM32单片机+2x180_SG90+2x360_SG90+OLED屏幕 2.OLED屏幕显示舵机的方向、速度、角度各项数据 3.按键1:控制180度舵机正向转动角度      4.按键2:控制180度舵机反向转动角度 5.按键3:控制360度舵机正向转动并且控制舵机速度      6.按键4:控制360度舵机反向转动并且控制舵机速度 7.代码里面含有注释 8.硬件实物接上线就能直接运行

    pyside6-qml-modern-uiapp

    Pyside6+Qml+QtCreator做的桌面app

    基于深度堆叠卷积神经网络的图像融合详细文档+全部资料+优秀项目+源码.zip

    【资源说明】 基于深度堆叠卷积神经网络的图像融合详细文档+全部资料+优秀项目+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    基于卷积神经网络的语音识别声学模型的研究详细文档+全部资料+优秀项目+源码.zip

    【资源说明】 基于卷积神经网络的语音识别声学模型的研究详细文档+全部资料+优秀项目+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    IndexOutOfBoundsException(解决方案).md

    IndexOutOfBoundsException(解决方案)

    Mini-Imagenet数据集文件

    Mini-Imagenet数据集文件

    时间转换工具(BD时、GPS时、UTC时、北京时间相互转换,可计算日期)

    时间转换工具(BD时、GPS时、UTC时、北京时间相互转换,可计算日期)

    基于CNN神经网络实现的正方教务系统的验证码识别资料齐全+高分项目+文档+源码.zip

    【资源说明】 基于CNN神经网络实现的正方教务系统的验证码识别资料齐全+高分项目+文档+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    西北工业大学 人工智能程序设计 Python NOJ程序源代码.zip

    西北工业大学 人工智能程序设计 Python NOJ程序源代码.zip

    车辆、飞机、船检测12-YOLO(v5至v11)、COCO、CreateML、TFRecord、VOC数据集合集.rar

    车辆、飞机、船检测12-YOLO(v5至v11)、COCO、CreateML、TFRecord、VOC数据集合集.rar对象检测分配-V2 2024-03-10 7:04 pm ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括2992张图像。 以可可格式注释船舶飞机。 将以下预处理应用于每个图像: *像素数据的自动取向(带有Exif-Arientation剥离) *调整大小为640x640(拉伸) 没有应用图像增强技术。

    基于SpringBoot2/3+Sa-Token+Mybatis-Plus和Vue3+Ant Design Vue+Uni-App+Uni-UI,并以高质量代码为核心,简洁、高效、安全的快速开发平台

    SmartAdmin以「高质量代码」为核心,「简洁、高效、安全」的快速开发平台;基于SpringBoot2/3+Sa-Token+Mybatis-Plus和Vue3 +Ant Design Vue+UniApp (提供JavaScript和TypeScript双版本、Java8和java17双版本);满足三级等保、网络安全、数据安全等功能要求。并重磅开源千余家企业在使用的《高质量代码规范》等

    计算机语言学中并查集数据结构的C++实现

    欢迎下载

    jsp基于WEB操作系统课程教学网站的设计与实现(源代码+论文)(2024i6).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

    基于常规波束形成的时间窗方法以及基于卷积神经网络的时间窗方法水下目标方位估计算法详细文档+全部资料+优秀项目+源码.zip

    【资源说明】 基于常规波束形成的时间窗方法以及基于卷积神经网络的时间窗方法水下目标方位估计算法详细文档+全部资料+优秀项目+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    html+css网页设计 美食 蛋糕美食7个页面

    预览地址:https://blog.csdn.net/qq_42431718/article/details/144633992 html+css网页设计 美食 蛋糕美食7个页面

    Python&OpenCV手势识别系统(完整源码&自定义UI操作界面&视频教程)

    Python高分毕设——Python&Opencv手势识别系统(完整源码&自定义UI操作界面&视频教程) Python高分毕设——Python&Opencv手势识别系统(完整源码&自定义UI操作界面&视频教程) 使用了OpenCV的视频采集, 图像色域转换, 颜色通道分割, 高斯滤波, OSTU自动阈值, 凸点检测, 边缘检测, 余弦定理计算手势等功能. 准备工作 安装 Python-OpenCV 库 pip install opencv-python -i https://mirrors.ustc.edu.cn/pypi/web/simple 利用 -i 为pip指令镜像源, 这里使用电子科技大学的源, 速度比官方源更快. 安装 Numpy 科学计算库 pip install numpy -i https://mirrors.ustc.edu.cn/pypi/web/simple 安装 PyAutogui 库 pip install pyautogui -i https://mirrors.ustc.edu.cn/pypi/web/simple 代码实现 import nu

    Friday night funkin

    Friday night funkin

Global site tag (gtag.js) - Google Analytics