`

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();
		}
	}
}
 

 

分享到:
评论

相关推荐

    C#winform TCP通信 UDP通信 Socket通信 vs2017 .net4.0

    总结来说,"C# WinForm TCP通信 UDP通信 Socket通信 vs2017 .net4.0"项目是一个学习和实践C#网络编程的好材料。通过此项目,开发者可以深入理解TCP和UDP的区别,掌握如何在C#环境中使用Socket进行网络通信,并了解...

    TCP.UDP.rar_C++TCP UDP通信_TCP UDp_UDP TCP_UDP 通信协议C++_网络通信 UDP

    TCP通信通常包括服务器端和客户端两部分,服务器端创建监听套接字,等待客户端的连接请求,而客户端则主动发起连接,建立TCP连接后,双方即可通过套接字进行数据交换。 相对而言,UDP是一种无连接的、不可靠的传输...

    UE5 TCP/UDP通信插件 SimpleUDPTCPSocketClient

    UE5 TCP/UDP通信插件 SimpleUDPTCPSocketClientUE5 TCP/UDP通信插件 SimpleUDPTCPSocketClientUE5 TCP/UDP通信插件 SimpleUDPTCPSocketClientUE5 TCP/UDP通信插件 SimpleUDPTCPSocketClientUE5 TCP/UDP通信插件 ...

    基于TCP/UDP的网络通信

    基于TCP/UDP的网络通信 本文将详细介绍基于TCP/UDP的网络通信,实现注册、登录等功能的聊天系统。聊天系统主要包括注册、登录、群聊、单聊、显示在线人员和退出功能。系统主要包括客户端、服务器端和客户显示端。...

    TCP、UDP 通信程序设计实验报告

    在深入探讨TCP与UDP通信程序设计实验报告之前,我们首先要了解TCP(传输控制协议)和UDP(用户数据报协议)之间的区别和联系。TCP是一种面向连接的协议,它提供可靠的数据传输服务,保证数据包按顺序到达,并且能够...

    安川机器人与PLC进行UDP通信与TCP通信指导手册.zip

    在安川机器人与PLC的UDP通信中,主要步骤包括: - **设置IP地址和端口号**:双方需要配置相同的IP地址和端口号以便数据交换。 - **数据包发送**:安川机器人或PLC作为发送方,将数据封装成UDP数据报并发送。 - **...

    Qt通过TCP/UDP实现网络通信

    Qt通过TCP/UDP实现网络通信Qt通过TCP/UDP实现网络通信Qt通过TCP/UDP实现网络通信Qt通过TCP/UDP实现网络通信Qt通过TCP/UDP实现网络通信Qt通过TCP/UDP实现网络通信Qt通过TCP/UDP实现网络通信Qt通过TCP/UDP实现网络通信...

    java读写Modbus TCP UDP数据,java与modbus通信,Modbus TCP UDP与java通信 全开源

    java读写Modbus TCP UDP数据,java与modbus通信,Modbus TCP UDP与java通信 全开源 这是一个能正常通过Modbus TCP UDP协议读写项目 请放心下载,完全开源,在多个项目中已经使用

    Android与服务器通信(TCP&UDP

    为了更好地理解和实践Android的TCP和UDP通信,可以参考"Android与服务器通信(TCP&UDP)"压缩包中的示例代码,它包含具体的客户端和服务器端实现,可以帮助你深入理解这两种通信方式的工作原理和使用方法。...

    tcpudp 2.1.1 TCP/UDP 调试软件

    "tcpudp 2.1.1 TCP/UDP 调试软件"是一款专门用于分析和调试TCP与UDP协议的工具,对于初学者来说,它可以帮助理解这两种协议的工作原理,以及如何在实际应用中使用它们。该软件可能包含了如下的功能特性: 1. 数据包...

    TCP_UDP_COM2012.01.13.zip_QT TCP_Qt udp通信_UDP_qt udp

    本项目"TCP_UDP_COM2012.01.13.zip"提供了基于Qt库实现的TCP与UDP通信的小程序,旨在帮助开发者更深入地理解这两种协议的工作机制和差异。 TCP(传输控制协议)是一种面向连接的、可靠的协议,它确保数据在传输过程...

    tcp,udp测试工具

    "SocketTool4"可能是一款用于网络测试的工具,它可能包含了一系列用于TCP和UDP通信的实用程序,例如: 1. TCP连接测试:这类工具可以用来测试两个端点之间的TCP连接是否正常,检查端口是否开放,测量连接建立的时间...

    Labwindow_cvi TCP UDP通信例程

    在LabWindows/CVI中实现TCP通信,你需要了解以下关键概念: 1. **创建套接字**:使用socket函数创建一个TCP套接字,指定协议类型为AF_INET(IPv4)或AF_INET6(IPv6),以及SOCK_STREAM(TCP)。 2. **地址结构体*...

    tcp/udp通信实验报告

    TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是网络通信中的两种主要传输协议,它们在互联网应用中扮演着至关重要的角色。TCP 提供的是面向连接的服务,而 UDP 则是一种无连接的服务。 ...

    C# socket通信TCP和UDP方式

    在C#中,我们可以使用`System.Net.Sockets.TcpListener`和`System.Net.Sockets.TcpClient`类来实现TCP通信。`TcpListener`用于创建服务器,监听指定端口的连接请求;`TcpClient`则代表客户端,用于建立到服务器的...

    TCP_UDP_PerformanceTest 测试工具

    在计算机网络通信领域,TCP(传输控制协议)与UDP(用户数据报协议)是两种广泛使用的传输层协议。TCP以其可靠性和顺序传输著称,而UDP则以高效和低延迟为特点。TCP_UDP_PerformanceTest是一款专门用于测试这两种...

    基于STM32的TCP、UDP通信中断方式.rar

    在STM32中实现TCP通信,首先需要配置硬件时钟以支持网络接口,如以太网控制器(如ETH)或者Wi-Fi模块。接着,开发者需要配置TCP/IP协议栈,如lwIP或uIP,这些协议栈实现了TCP/IP协议族,使得微控制器可以进行网络...

    Tcp_Udp.rar_TCP UDp_UDP通信_tcp udp测试_tcp 性能测试

    在"Tcp_Udp测试"这个压缩包中,可能包含了一些用于TCP和UDP通信测试的工具或者示例代码,用于帮助开发者理解这两种协议的工作原理,或者评估特定网络环境下的性能。这些测试可以模拟不同的网络条件,如高丢包率、高...

    TCP&UDP测试工具_tcp&udp_TCP/UDP测试工具_TCP工具_

    在IT行业中,网络通信是至关重要的部分,而TCP(传输控制协议)与UDP(用户数据报协议)作为两种主要的传输层协议,扮演着不同角色。TCP提供的是面向连接、可靠的、基于字节流的传输服务,而UDP则是无连接、不可靠的...

    udp/tcp通信

    本文将详细探讨"udp/tcp通信"这一主题,主要关注NJ的网络通信指令,特别是CIP类指令和SOCKET类指令,以及它们在网络通信中的应用。 首先,TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是...

Global site tag (gtag.js) - Google Analytics