java 网络编程TCP UDP 服务器 客户端

IP 位置

( IP) 是 Internet Protocol 的外语缩写, 网络之间互连的协议也就是为计算机网
络相互连接进行通信而设计的协议。 在因特网中,它是能使连接到网上的所有计算机网络
实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家
生产的计算机系统,只要遵守 IP 协议就可以与因特网互连互通。
端口:区分数据流向的软件 0-65535 不要使用 1024 以下的端口 ,每一个协议拥有
自己的端口,在同一个协议下端口不能重复 FTP:21 HTTP:80

端口

端口是虚拟的概念,并不是说在主机上真的有若干个端口。通过端口,可以在一个主机
上运行多个网络应用程序。可以类比为:IP 相当于公司,端口相当于公司各部门,URL,相当
于各部门的人员
包含端口,用于 socket 通信的

1) 、获取对象
InetSocketAddress(String hostname, int port)
InetSocketAddress(InetAddress addr, int port)
2) 、方法
getAddress() 返回 InetAddress 对象
getPort() 返回端口
getHostName() 返回域名

url

URL 全称是 Uniform Resource Location,也就是统一资源位置。实际上,URL 就是
一种特殊的 URI,它除了标识一个资源,还会为资源提供一个特定的网络位置,客户端可以
通过它来获取 URL 对应的资源。
URL 所表示的网络资源位置通常包括用于访问服务器的协议(如 http、ftp 等)、服务器
的主机名或者 IP 地址、以及资源文件在该服务器上的路径。典型的 URL 例如
http://localhost/myProject/index.html
URL 的语法表示形式为:
protocol://userInfo@host:port/path?query#fragment
协议://用户信息@主机名:端口/路径?查询#锚点
java.net.URL 类(后面直接叫 URL)是 JDK 对 URL 的统一抽象,它是一个 final 修饰的
类,也就是不允许派生子类。

传输层协议

1. 协议

TCP:TCP(transfer control protocol) 打电话 面向连接、安全、可靠,效率低
UDP:UDP(UserDatagramProtocol ) 发送短信 非面向连接、不安全、数据可能丢失 、
效率高

2. UDP 编程: DatagramSocket DatagramPacket

UserDatagramProtocol,一种无连接的传输层协议,提供面向事务的简单不可靠信息
传送服务。其特点为:非面向连接;传输不可靠;数据可能丢失。

1)、服务器:

①创建服务器 DatagramSocket 类 +指定端口
②准备接收容器 字节数组 +封装成 DatagramPacket 数据包
③接收数据
④分析数据
⑤释放资源

package day16.net03;

import java.io.FileOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/*
 * 	UDP实现基本流程: 接收端
 * 	1.构建接收端
 * 	2.准备包裹-->用来接收数据
 * 	3.接收
 * 	4.处理数据
 * 	5.关闭
 */
public class UDPReceive02 {
	public static void main(String[] args) throws IOException {
		System.out.println("--------------我是接收端-----------------------------------");
		//1.构建接收端
		DatagramSocket  receive = new DatagramSocket(8888);
		//2.准备包裹-->用来接收数据
		byte[] arr = new byte[1024*60];
		DatagramPacket  packet = new DatagramPacket(arr,arr.length);
		//3.接收
		receive.receive(packet);
		
		//4.处理数据
		/*
		 * byte[] getData() 
		          返回数据缓冲区。 
		   int getLength() 
		          返回将要发送或接收到的数据的长度。 
		 */
		byte[] result = packet.getData();
		int length = packet.getLength();
		System.out.println(new String(result,0,length));
		FileOutputStream fileOutputStream =new FileOutputStream("D:\\IdeaProjects\\test\\src\\day16\\net03\\R.txt");
		fileOutputStream.write(result);
		//5.关闭
		fileOutputStream.close();
		receive.close();
	}
}


2)、客户端:

①创建客户端 DatagramSocket 类 +指定端口
②准备数据 字节数组
③封装成数据包 需要指定包发送的地址+端口 即服务器地与端口
④发送数据
⑤释放资源


package day16.net03;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.*;

/*
 * 传输层协议: 合同
 * 	UDP: 写信 发短信  非面向连接    不安全   只管写只管发送->效率高 协议简单,开销小	大小有限制一般不超过60k  --> 发送端和接受端两端平等   --> 字节数组
 * 	TCP: 打电话	  面向连接	  安全	  基于3次握手-> 1)你在么?     2)在呢  ,建立连接  3)传输			  --> 客户端 服务器端
 * 
 * Socket 套接字
 * 	相当于传输层为应用层开辟的一个小口子
 *          不同协议下Socket实现不同
 *          面向Socket编程
 *          
 *   DatagramSocket       
 *   DatagramPacket       
 *          
 *    UDP实现基本流程: 发送端      
 *    	1.定义发送端 DatagramSocket(int port) 指定发送端ip和端口
 *    	2.准备数据--> 转为字节数组
 *    	3.打包  DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) 构造一个数据报包发送数据包的长度 length抵消 ioffsetto指定主机上的指定端口号。 
 *		4.发送数据 send(DatagramPacket p) 从这个套接字发送一个数据报包。 
 *		5.关闭
 *
 *---文件的传输---> 从本地文件中 读取数据-->传输到对方-->接收到数据-->写出指定本地位置
 */
public class UDPSend01 {
	public static void main(String[] args) throws IOException {
		System.out.println("--------------我是发送端-----------------------------------");
		//1.定义发送端 DatagramSocket(int port) 指定发送端ip和端口
		//InetSocketAddress inetSocketAddress = new InetSocketAddress();
		File file = new File("D:\\IdeaProjects\\test\\src\\day16\\net03\\text.txt");
		FileInputStream fileInputStream = new FileInputStream(file);
		DatagramSocket  send = new DatagramSocket(7777);
		//2.数据
		byte[] b = new byte[1024];
		//用来接收每次读到的字节数量;
		fileInputStream.read(b);
//		int len = -1;
		//read(byte[]) 读取一定数量的字节也就是参数设置的大小 放到缓存区 返回每次读取的字节数量   read() 返回每次读取到的字节;
//		while ((len=fileInputStream.read(b))!=-1){
//			//将缓存区的字节输出到目标文件 因为文件末尾读到的字节数不确定所以 每次输出缓存区的 0 到 实际读到的字节长度;
//
//		}
		//3.打包
		DatagramPacket  packet = new DatagramPacket(b,0,b.length,new InetSocketAddress("192.168.14.135", 8888));
		//4.发送
		send.send(packet);
		//5.关闭
		fileInputStream.close();
		send.close();
	}
}

TCP 编程:ServerSocket Socket

transfer control protocol,一种面向连接(连接导向)的、可靠的、基于字节流的传输
层(Transport layer)通信协议的点到点的通信 。TCP 三次握手(Three-way Handshake),
类似于拨打电话

1.特点

基于 tcp 协议,建立稳定连接的点对点的通信;实时、快速、安全性高、占用系统资源
多、效率低;“请求-响应”模式:
a)、客户端:在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序
b)、服务器:第一次通讯中等待连接的程序被称作服务器端(Server)程序
• Socket:发送 TCP 消息
• ServerSocket:创建服务器
套接字是一种进程间的数据交换机制。这些进程既可以在同一机器上,也可以在通过网
络连接的不同机器上。换句话说,套接字起到通信端点的作用。单个套接字是一个端点,而
一对套接字则构成一个双向通信信道,使非关联进程可以在本地或通过网络进行数据交换。
一旦建立套接字连接,数据即可在相同或不同的系统中双向或单向发送,直到其中一个端点
关闭连接

2. 服务器:

①创建服务器 指定端口
②等待客户端连接
③分析接收数据

package day16.net03;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/*	tcp基于IO流操作
 * TCP 基本流程: 服务端
 * 	1.创建服务端	ServerSocket(int port)   创建绑定到特定端口的服务器套接字。 服务端的端口号
 * 	2.阻塞式监听
 * 	3.获取IO流        
 * 	4.读入数据
 * 	5.操作数据
 * 	6.关闭
 */
public class TCPServer04 {
	public static void main(String[] args) throws IOException {
		System.out.println("---------------Server--------------");
		//1.创建服务端
		ServerSocket server = new ServerSocket(8888);
		//2.阻塞式监听
		Socket client = server.accept();
		System.out.println("-----------有一个客户端连接成功-------------------");
		
		//3.获取IO流  
		InputStream is = client.getInputStream();
		
		//4.读入数据
		byte[] car = new byte[1024];
		//把数据读入到字节数组car中,返回值len为读入到字节数组中真实数据的长度
		int len = is.read(car);
		
		//5.操作数据
		System.out.println(new String(car,0,len).equals("laopei"));
		
		//6.关闭
		is.close();
		client.close();
		server.close();
	}
}


3. 客户端:

①连接服务器: 创建客户端 +指定服务器地址 +端口
②发送数据

package day16.net03;

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

/*	tcp基于IO流操作
 * TCP 基本流程: 客户端
 * 	1.创建客户端	Socket(String host, int port)  指定服务端的IP+端口
 * 	2.获取IO流
 * 	3.写出数据
 * 	4.关闭
 * 
 * --------------登录: 客户端向服务器传输用户名和密码的值,服务端接受到数据进行数据校验(用户名=laopei,密码=0523),校验结果服务端直接打印就可以-------------------
 */
public class TCPClient03 {
	public static void main(String[] args) throws UnknownHostException, IOException {
		System.out.println("---------------client--------------");
		//1.创建客户端
		Socket client =  new Socket("127.0.0.1",8888);
		//2.获取输入流
		OutputStream is = client.getOutputStream();
		//3.写出数据
		is.write("zhangsan".getBytes());
		//4.关闭
		is.close();
		client.close();
	}
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: TCP(传输控制协议)是一种面向连接的协议,它为两台计算机之间的通信提供了可靠的通信机制。它为应用程序提供了可靠的字节流传输服务,可以保证数据传输的可靠性和安全性。UDP(用户数据报协议)是一种无连接的协议,它可以将数据报文发送到网络上的任何主机,而不需要建立连接。它提供了一个不可靠的数据传输服务,没有保证数据的可靠性和安全性。 ### 回答2: TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种常见的传输层协议,它们在Java编程中有一些明显的区别。 首先,TCP是一种面向连接的协议,而UDP是一种无连接的协议。在TCP中,客户端服务器之间建立连接,并且在数据传输之前进行握手和断开连接。而在UDP中,数据包可以直接发送给接收方,无需建立连接。因此,在需要实时传输并且延迟较低的应用中,UDP会更适合,而在需要可靠性和顺序性的应用中,TCP更可靠。 其次,TCP提供可靠的数据传输机制,确保数据的完整性和正确性。它使用了序列号和确认机制来保证数据的顺序和完整性,并且具有自动重发机制,以处理丢失的数据包。而UDP不提供这些机制,数据包可能会在传输过程中丢失或乱序,因此需要应用程序自己处理这些问题。 此外,TCP是一种面向字节流的协议,它将数据视为连续的字节流,没有明确的消息边界。因此,在使用TCP传输数据时,需要应用程序设计专门的协议来区分不同的消息。而UDP是一种面向数据报的协议,每个UDP数据包都有固定的大小,可以直接发送和接收,应用程序可以很容易地区分不同的数据包。 最后,TCP具有较高的延迟和较高的网络开销。由于建立连接、保证可靠性等机制的存在,TCP会引入一定的延迟和网络开销。而UDP没有这些机制,因此具有较低的延迟和网络开销。 综上所述,TCPUDPJava中的使用有一些明显的区别。TCP适合需要可靠性和顺序性的应用,而UDP适合实时传输和延迟较低的应用。根据实际需求选择合适的协议可以提高程序的性能和效率。 ### 回答3: TCP(传输控制协议)和UDP(用户数据报协议)都是在网络通信中使用的传输层协议,它们之间有以下几个区别: 1. 连接和无连接:TCP是一种面向连接的协议,通信双方在数据传输之前需要建立连接,确保数据的可靠传输。而UDP是一种无连接的协议,通信双方之间不需要建立连接,可以直接发送数据。 2. 可靠性:TCP提供可靠的数据传输,通过使用确认和重传机制来确保数据的完整性和可靠性。而UDP不提供可靠性保证,发送端发送的数据包是否能到达接收端是不做任何保证的,也无法检测和恢复丢失的数据包。 3. 数据包的顺序:TCP保证数据包的顺序,即数据包按照发送顺序传输到接收端,接收端可以按照相同的顺序重新组装数据。而UDP不保证数据包的顺序,可能会导致接收端按照不同的顺序接收数据包。 4. 传输效率:TCP需要维护连接状态、进行拥塞控制等,因而比UDP的传输效率稍低。UDP没有这些额外的负载,传输效率较高。 5. 适用场景:TCP适用于需要可靠传输、传输量较大、带宽较高的应用场景,比如网页浏览、邮件收发、文件传输等。UDP适用于实时性要求较高、传输量较小、带宽较低的应用场景,比如语音通话、视频传输、实时游戏等。 综上所述,TCPUDP在可靠性、连接方式、数据包顺序和传输效率等方面存在着明显的差异,并且适用于不同的应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值