网络编程UDP/TCP协议

一、网络编程三要素

IP:网络中设备的标识,不易记忆,可用主机名

端口号:用于标识进程的逻辑地址,不同进程的标识

传输协议:通讯的规则常见协议:TCP,UDP

UDP

把数据打成一个数据包 , 不需要建立连接

数据包的大小有限制不能超过64k

因为无连接,所以属于不可靠协议(可能丢失数据)

因为无连接 ,所以效率高

TCP

需要建立连接,形成连接通道

数据可以使用连接通道直接进行传输,无大小限制

因为有链接,所以属于可靠协议

因为有链接,所以效率低

二、IP以及端口号

1、InetAddress类 —— 表示互联网协议 (IP) 地址

1)此类没有构造方法,创建对象使用方法实现

public static InetAddress getByName(String host) //参数为主机名或者IP的字符串表现形式

2)常用方法

public String getHostAddress() 获取IP

public String getHostName() 获取主机名

2、cmd IP查询

127.0.0.1 本地回环地址 用来做一些本地测试 不走交换机

ping IP地址 用来检测本机是否可以和指定的IP地址的计算机可以进行正常通讯

ipconfig /all  用来查看IP地址

getmac       用来获取mac地址

3、端口号 —— 逻辑端口

用来标示我们的计算机上的进程(正在运行的程序),端口号的有效范围应该是 0-65535,其中0-1024被系统占用或者保留

三、UDP协议

1、DatagramSocket类 —— 此类表示用来发送和接收数据报包的套接字

1)构造方法:

public DatagramSocket()

public DatagramSocket(int port) //参数port 端口号

public DatagramSocket(int port,InetAddress laddr) //参数laddr IP对象

2)常用方法:

public void close()关闭此数据报套接字

public void send(DatagramPacket p) 发送数据报包

public void receive(DatagramPacket p) 接收数据报包

public InetAddress getInetAddress() 返回此套接字连接的地址。如果套接字未连接,则返回 null。

2、DatagramPacket类 —— 此类表示数据报包

1)构造方法:

public DatagramPacket(byte[] buf,int length)

//参数 buf:保存传入数据报的缓冲区 length:一次要读取的长度

public DatagramPacket(byte[] buf,int length,InetAddress address,int port)

//参数 buf:包数据 length:包长度 address:目的IP port:目的端口号

2)解析数据:

public byte[] getData()返回用来接收或发送数据的缓冲区

public int getLength()返回将要发送或接收到的数据的长度

3、使用UDP传输数据

1)客户端:

public class SentDemo {
				public static void main(String[] args) throws IOException {
					InetAddress ip = InetAddress.getByName("接收端ip的字符串变现形式");
					DatagramSocket ds = new DatagramSocket();

					byte[] buf = "abc".getBytes();
					DatagramPacket dp = new DatagramPacket(buf, buf.length, ip, 6666);	//端口号不能定义成0-1024

					ds.send(dp);
					ds.close();
				}
			}

2)接收端:

public class ReceiveDemo {
				public static void main(String[] args) throws IOException {
					DatagramSocket ds = new DatagramSocket(6666);

					byte[] buf = new byte[1024];
					DatagramPacket dp = new DatagramPacket(buf, buf.length);

					ds.receive(dp);

					System.out.println(new String(dp.getData(),0,dp.getLength()));
					ds.close();
				}
			}

四、TCP协议 —— 使用管道输入输出流传输数据

1、服务器端

1)创建TCP通讯协议服务器端对象

ServerSocket ss = new ServerSocket("端口号");

2)监听客户端

Socket sk = ss.accept();

3)获取管道输入流对象

InputStream is = sk.getInputStream();

4)读取数据 //在使用管道输入流while循环接收数据的时候,不能以-1作为读取完毕的判定条件

//一般循环读取数据时,在客户端调用shutdownOutput()方法,服务端自动跳出循环

byte[] buf = new byte[1024 * 8];

int len = is.read(buf);

System.out.println(new String(buf,0,len));

5)释放资源

ss.close(); //一般服务器不用关闭

2、客户端

1)创建TCP通讯协议客户端对象

Socket sk = new Socket("服务端IP","服务端端口号");

2)获取管道流输出对象

OutputStream os = sk.getOutputStream();

3)写数据

os.write("需要传输的内容".getBytes());

4)释放资源

sk.close();

3、服务端反馈

服务端:

1)创建TCP通讯协议服务器端对象

2)监听客户端

3)获取管道输入流对象

4)读取数据

5)获取管道输出流对象

OutputStream os = sk.getOutputStream();

6)反馈信息

os.write("已收到".getBytes());

客户端:

1)创建TCP通讯协议客户端对象

2)获取管道流输出对象

3)写数据

4)获取管道输入流对象

InputStream is = sk.getInputStream();

4)接收反馈信息

byte[] buf = new byte[1024 * 8];

int len = is.read(buf);

System.out.println(new String(buf,0,len));

5)释放资源

4、shutdownOutput()方法

当客户端发送文件时,发送完毕后调用shutdownOutput()方法,服务端就会收到,停止接收;

sk.shutdownOutput();

5、TCP服务端多线程改进

public class TCPServerDemo {
			public static void main(String[] args) throws IOException {
				ServerSocket ss = new ServerSocket(9527) ;
				//循环监听客户端
				while(true){
					Socket sk = ss.accept() ;
					// 开启线程
					new Thread(new TCPServerThread(sk)).start() ;
				}
			}
		}
public class TCPServerThread implements Runnable {
			private Socket sk ;
			public TCPServerThread(Socket sk){
				this.sk = sk ;
			}
			@Override
			public void run() {
				try {
					BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream())) ;
					BufferedWriter bw = new BufferedWriter(new FileWriter("a.java")) ;
					// 一次读取一行
					String line = null ;
					while((line = br.readLine()) != null){
						bw.write(line) ;
						bw.newLine() ;
						bw.flush() ;
					}
					try {
						Thread.sleep(100) ;
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					// 给客户端端反馈
					// 获取输出流对象
					OutputStream out = sk.getOutputStream() ;
					out.write("上传文件成功!".getBytes()) ;

				} catch (Exception e) {
					e.printStackTrace() ;
				}
			}
		}
时间: 2024-10-09 23:15:22

网络编程UDP/TCP协议的相关文章

C#网络编程之---TCP协议的同步通信(二)

上一篇学习日记C#网络编程之--TCP协议(一)中以服务端接受客户端的请求连接结尾既然服务端已经与客户端建立了连接,那么沟通通道已经打通,载满数据的小火车就可以彼此传送和接收了.现在让我们来看看数据的传送与接收 先把服务端与客户端的连接代码敲出来 服务端 IPAddress ip = new IPAddress(new byte[] { 127, 1, 1, 1 }); TcpListener server = new TcpListener(ip, 8005); server.Start();

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程B1同时为客户进程A1.A2和B2提供服务. Socket概述 ①   所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过“套接字”向网络发出请求或者应答网络请求. ②   Socket是连接运行在网络上的两个程序间的双向通信的端点. ③  

java 网络编程 UDP TCP

网络编程 网络编程主要用于解决计算机与计算机(手机.平板..)之间的数据传输问题. 网络编程: 不需要基于html页面就可以达到数据之间的传输. 比如: feiQ , QQ , 微信....网页编程: 就是要基于html页面的基础上进行数据的交互的. 比如: 珍爱网. oa(办公自动化). 高考的报告系统... 计算机网络: 分布在不同地域 的计算机通过外部设备链接起来达到了消息互通.资源共享的效果就称作为一个计算机网络.网络通讯的三要素:    1. IP    2. 端口号.    3. 协

C#网络编程之--TCP协议(一)

TCP 是面向连接的传输协议 面向连接,其实就好比,A打电话给B,如果B接听了,那么A和B之间就的通话,就是面向连接的 TCP 是全双工的传输协议 全双工,这个理解起来也很简单,A打电话给B,B接听电话,那么A可以说话给B听,同样B也可以给A说话,不可能只允许一个人说话. TCP 是点对点的 点对点,这个看了上面的举例相比大家都知道了,还要说一点的是,如果在A和B打电话过程中,B又来了一个紧急电话,那么B就要将与A的通话进行通话保持,所以不管怎么讲同一个连接只能是点对点的,不能一对多. TCP

Java 网络编程 之 TCP协议

TCP协议 (服务器端程先启动,等待客户端连接) TCP协议是面向连接的通信协议,即在传输数据前先在发送端和接收端建立逻辑连接,然后再传输数据 保证传输数据的全性安,文件数据不易丢失 在JDK中提供了两个类用于实现TCP程序,一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端. 首先创建代表服务器端的ServerSocket对象,并等待客户端的连接, 然后创建代表客户端的Socket对象向服务器端发出连接请求,服务器端响应请求,客户端再次向服务器端发送确认信

C# socket网络编程 基于TCP协议

socket 服务器端: 1.创建socket Socket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//三个参数分别为枚举类型(网络),Socket类型,协议 2.绑定ip和端口号 IPAddress ipAddress = new IPAddress(new byte[] {192,168,119,1}); EndPoint point =new IPEnd

Java学习笔记53(网络编程:TCP协议案例)

简易的案例 客户端: package demo; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; public class TCPClient { public static void main(String[] args) throws IOException { Socket socket = new Socket("127

黑马程序员 网络编程 UDP与TCP

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ----------------------/* 网络编程分为两种模式:TCP和UDP 连接互联网的计算机以亿计,为了唯一的标识出每台电脑,互联网就给每台电脑分配一个 唯一独立的ip地址,通过这个ip地址就可以进行计算机之间的数据交换 我们计算机交换的数据功能我们在java中把它封住成一个叫Socket的类, 简称套接字, 端口号:计算机数据的交换一般都是电脑上的程序来维护的,而电脑上又运

linux网络编程笔记——TCP

1.TCP和UDP TCP是长连接像持续的打电话,UDP是短消息更像是发短信.TCP需要消耗相对较多的资源,但是传输质量有保障,UDP本身是不会考虑传输质量的问题. 2.网络传输内容 我习惯的做法是直接通过TCP传送结构体,当然前提是收发两端都在程序里对目标结构体有充分的定义.特别说明的一点是,要小心收发两端处理器的大小端问题!而且传输信息头里必须包含长度信息,而且通用的是大端.但是,这里的长度和结构体,我选择用小端进行传输. 3.TCPserver实现 参考了别人多线程的回调写法,看起来不错.