计算机网络基础-1.TCP、UDP简单通信java实现

首先看一下经典的ISO/IOS网络模型


其中常用的协议在应用层、传输层、网络层。

应用层:远程登入协议Telnet、文件传输协议FTP、超文本传输协议HTTP、域名服务DNS、简单邮件传输协议SMTP等。

传输层:传输控制协议TCP、用户数据报协议UDP。

TCP:面向连接的可靠的传输协议。

UDP:是无连接的,不可靠的传输协议。

网络层:网际协议IP。

******************************************************************************************************************************

这里着重介绍下TCP、UDP协议

TCP:(Transfer Control Protocol)是一种面向连接的保证可靠传输的协议。发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,

当一个socket(通常是server socket)等待连接时,另一个socket可以要求连接,一旦两个socket建立起来,他们就可以进行双向数据传输。

HTTP、FTP、Telent等应用都需要靠这种可靠的通信通道。

UDP:(User Datagram Protocol)是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址。UDP就像写信一样,填上对方的地址就发送出去

他在网络上以任何可能的路径到达目的地,但能否到达目的地、到达时间及内容的正确性都不能考证。

*******************

作为一个简单比较

——使用UDP,每个数据报中都给出了完整的地址信息、因此无需建立发送方和接收方的连接。

——对于TCP协议,它是一个面向对象的连接,在socket之间进行数据传输之前必然要建立连接,所以TCP中多了一个连接建立的时间

——UDP传输数据时有大小限制,每个传输的数据必须在64KB之内。

——TCP没有限制,一旦建立连接,双方的socket可以按统一的格式传输数据

**************************************************************************************************

通常TCP协议的实现是由套接字socket来完成。socket是连接运行在网络上的两个程序间的双向通讯的端点。通常一个socket在服务器端;另一个在socket

在客户端。下图使用ServerSocket和Socket实现服务器端和客户端的Socket通信。不管使用什么形式,其基本模型都是下面形式。


服务器端

首先java提供ServerSocket实现服务端的socket,该socket等待服务端的请求到来;

构造对象后调用accept()方法,当没人连接时,该方法会阻塞,直到接受连接,并返回socket对象;

客户端

建立socket对象,标明连接对象,端口号;

一旦双方的连接建立好后,双方是平等的,在流上进行双向的数据传递。通信完成后关闭资源。

服务器代码:

package net;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;


public class TcpServer
{
	
	public static void main(String[] args) throws IOException
	{
		//监听5000端口
		ServerSocket ss = new ServerSocket(5000);
		
		Socket socket = ss.accept();
		//获取客户端的输出流
		InputStream is  = socket.getInputStream();
		
		byte[] buffer = new byte[200];
		
		int length = 0;
		
		while(-1 != (length = is.read(buffer,0,buffer.length)))
		{
			String str = new String(buffer,0,length);
			
			System.out.println(str);
		}
		
		is.close();
		socket.close();
		
	}
}
客户端代码:

package net;

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

public class TcpClient
{
	public static void main(String[] args) throws Exception
	{
		Socket socket = new Socket("127.0.0.1", 5000);
		//建立客户端的输出流
		OutputStream os = socket.getOutputStream();
		//往输入流中写内容
		os.write("HelloWorld".getBytes());
		//没写close()方法会提示出错
		socket.close();
		
	}
} 

*************************************************************************************************************

基于UDP的通信协议

java中使用DatagramSocket类来利用UDP协议实现客户与服务器的Socket,send()发送数据包,receive()接受数据包。


实现步骤:

1.服务器端构造DaragramSocket对象,然后载构造DatagramPacket对象,数据报包,将发送的数据放在DaragramPacket包中;

2.将数据包通过send()和receive()实现发送或接受,当客户端填好地址及端口将数据包发送给服务端时,packet可以通过getAddress()

与getPort()获得客户端的地址与端口;

3.发送完后再次构造与接受;

服务器端代码:

package net;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UdpServer
{
	public static void main(String[] args) throws Exception
	{
		//定义socket
		DatagramSocket socket = new DatagramSocket();
		
		String string ="hello world";
		//定义包,发送给目标机器localhost
		DatagramPacket packet = new DatagramPacket(string.getBytes(), 
					string.length(),InetAddress.getByName("localhost"),7000);
		
		//定义完包后发送
		socket.send(packet);
		
		//下面接受对方发过来的welcome
		byte[] buffer = new byte[1000];
		
		DatagramPacket packet2 = new DatagramPacket(buffer, 100);
		
		socket.receive(packet2);
		
		System.out.println(new String(buffer,0,packet2.getLength()));
		//关闭流
		socket.close();
	}
}

客户端代码:

package net;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpClient
{
	public static void main(String[] args) throws Exception
	{
		DatagramSocket socket = new DatagramSocket(7000);
		
		byte[] buffer = new byte[1000];
		
		DatagramPacket packet = new DatagramPacket(buffer, 1000);
		//接收
		socket.receive(packet);
		//打印接收的内容
		System.out.println(new String(buffer,0,packet.getLength()));
		

                //发送welcome
		String string = "welcome";
	        //通过接受的packet,获取服务器端地址及端口号
		DatagramPacket packet2 = new DatagramPacket(string.getBytes(), 
					string.length(),packet.getAddress(),packet.getPort());
		
		socket.send(packet2);
		
		socket.close();
	}
}

这里UDP的代码形式和TCP的可以形成对比,UDP就像写信一样,写好内容,收信人地址、端口就可以发送出去,

待对方收到信要回信时,可以通过信封上的地址回信;而TCP是以流的形式实现数据的传送。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值