网络编程

本文深入解析TCP和UDP这两种网络通信协议的特点与应用。TCP作为可靠的字节流传输协议,强调数据传输的顺序性和可靠性;而UDP则侧重于高效的数据报传输,适用于对实时性要求较高的场景,如音频和视频流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网络编程就是socket编程,通常来说就是TCP和UDP的应用。

1.先说TCP吧

TCP是可靠的,端到端的字节流传输协议。首先,必须建立连接,然后每发一个东西对方都必须确认,一定是按照顺序传输的,不会乱。

一端有一个ServerSocket,一直在监听某个端口(通常使用1025-65535),另一端是一个Socket,试图向ServerSocket发送请求。两端连接上以后,可以通过i/o的方式进行数据通信。

注意,TCP传输的是字节流而不是报文流。


2.再说UDP

UDP是不可靠的,发送时无需建立连接。发出去就好,对方收到还是没有收到,不知道,也不管,效率高。

没有明确的Server和Client的区别,使用DatagramSocket,设定一个端口号,然后这个DatagramSocket既可以发送消息(使用send方法),也可以接收消息(使用receive方法)。

对于UDP来说,一端给另一端发送的消息里面已经封装了自己的信息,比如地址和端口号,就好像写信一样。



TCP

首先,两个java应用程序可以通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket,Socket通常用来实现Client-Server的连接

相关的一些类都位于 java.net包里面,有一个ServerSocket.java用于Server端,有一个Socket.java用于Client端。建立连接时所需的寻址信息为远程计算机的ip地址和端口号。

ip地址相当于计算机的名字,每台计算机都有唯一的ip地址,而端口号相当于应用程序的名字,比如说qq,msn等等,指定特定的端口号才能保证数据是在同一个应用程序中传输。端口号最好的范围是1025-65535,因为小于等于1024的随时有可能被系统征用。

其实在我们访问网页的时候比如:http://www.google.com的全部格式是http://www.google.com:80,只不过http的协议默认就是80,所以写不写都行。同时要注意的是tcp和udp各有65536个端口号,所以即使两个的端口号一样,也没有关系,根本不是一个。

写网络应用程序的时候有一个潜规则,首先启动server,再启动client,写的时候最好两个文件一起写。

如果是纯粹的单一的S/C模型,那么,Server指定一个端口进行监听,Client主动申请连接这个端口,它自己的端口号由系统随机分配一个。

举个简单例子:

TCPServer

ServerSocket ss = new ServerSocket(6666);
Socket s = ss.accept();
System.out.println("a client is connected");


TCPClient

Socket s = new Socket("127.0.0.1",6666);


其中,Server监听在6666端口,当有client连接的时候,接受请求,并打印。。。而Client直接连接本机上面的6666号端口。

对于Server来说,当然不希望只连接一次就完了,所以呢,Server部分的代码应该是

ServerSocket ss = new ServerSocket(6666);
while(trure){
     Socket s = ss.accept();
     Print....
}


然后接下来要做的就是发东西了,光连上了没有实际的用途,还得发送点什么,比如说一个message之类的,这时候要用到的就是io了。通常的情况就是client弄一个输出流,然后在server弄一个输入流。然后很简单,利用输出流中的write方法写一个东西,然后在server端的输入流利用read方法来读取,然后打印出来或者做其他进一步处理。这个server端的read方法会一直在那里等着,知道收到来自于client端的数据。读完以后记得要调用close方法关闭io,关闭socket。

提醒一点,就是说建立InputStream或者OutputStream的时候,根据实际情况看看需不需要在它们的外面包装一个管道,这样就可以比较方便地利用其中的方法。

当然可以又读又写,只是注意一下顺序,如果server是先读后写的话,client就应该是先写后读。反之亦然。

UDP

其实Socket程序的写法都是大概固定的,所以要好好记一下。但是呢,要好好体会知识点之间的关系,比如socket和io,线程的关系。

UDP是不可靠的协议,但是呢,优点是它效率高,有些东西,比如音频,视频,假如数据传输错误了你不能老等,必须得继续播放下去,才能保证画面和音乐的连续流畅,用户体验才高。UDP之所以适合就是因为它效率高,虽然有时候丢几个数据包,但是最多造成的影响就只是多一两个杂音或者画面跳动一小下,但是不会影响整体的运行。TCP就不行,丢一个数据就一直在那里“握手”这样就相当于停住了,不是用户需要的。

首先是,UDP以数据报的形式传输,也就是把数据打成一个个的小包来传。所以必须先定一个byte类型的buffer,用它来设定一定大小的buffer。举例:

byte[] buf = new byte[1024];

然后再定义一个DatagramPacket,因为这个类型的格式才是UDP在工作的时候使用的数据格式。举例:

DatagramPacket dp = new DatagramPacket(buf, buf.length);

然后要说的是UDP没有明确区分Server和Client,都是用DatagramSocket来定义。 但是Server端和Client端的写法还是不一样。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值