Java基础回顾之 —— TCP/UDP

一.网络简介与说明

 为了实现两台计算机通信,必须有一个网络线路连接两台计算机。通常,由服务端,网络,客户端组成。有时,很难将服务端与客户端进行区分,因为两者是相对概念。通常,我们说的局域网(LAN)及时就是一群通过一定形式连接起来的计算机,可以由两台计算机组成,也可以由上千台计算机组成。将(LAN)延伸到更大的范围,就是广域网(WAN),我们通常说的因特网(Internet)就是无数个LAN与WAN共同组成的。

二.网络协议
 2.1    IP协议

 Internet网络采用的协议是TCP/IP协议,在全球范围内实现不同主机的互联,在互联网中,每台主机在网络上用ip地址代表自己。目前,ip地址用的是4个字节,也就是32位的二进制数来表示,称为IPv4,为了方便使用,通常取用每个字节的十进制数,并且每个字节之间用圆点隔开来表示IP地址,例如,192.168.1.1

 2.2   TCP/UDP协议

 在TCP/IP协议中,有两个高级协议是程序员应该熟悉的,即TCP(传输控制协议)与UDP(用户数据报协议)。

 TCP协议保证两台计算机之间可靠的额传输数据,而且抵达的数据排列顺序与发送时的顺序一致,TCP协议适合对可靠性要求比较高的场合,例如,打电话,必须先拨通 ,等双方都连接后,才能互相通信。

 UDP是无连接通信协议,不能保证可靠的数据传输,但是能够向若干个目标发送数据,UDP是以独立发送数据包的方式进行。UDP适合准确性不是很高的场合,例如,聊天室。UDP适应对传输速度和时效性要求较高的场合,及时以小部分数据丢失,或者顺序不同,不也影响。

三.端口与套接字

 端口并非真实的物理存在,而是一个假想的连接,端口被定义在0~65535之间的整数,HTTP服务一般使用80端口,FTP服务一般使用21端口。0~1023之间的端口一般用于知名的网络服务和应用,用户自定义端口最好是在1024以上的,避免端口号发生冲突。

 网络程序中的套接字(Socket)用于将应用程序与端口连接起来。

四.UDP以及Demo

 udp的通信基本模型:1.将数据包发送到目的地;2.接受别人发来的数据包。

 4.1   发送数据包的过程

 (1)使用DatagramSocket( )创建一个数据包套接字。

 (2)使用DatagramPacket(byte[] buf,  int length,  InetAddress address, int port)创建要发送的数据包。

 (3)使用DatagramSocket类的send( )方法发送数据包

 4.2   接收数据包的过程

 (1)使用DatagramSocket( int port)创建一个数据包套接字,并绑定在指定端口。

 (2)使用DatagramPacket(byte[] buf,  int length)创建要接受的数据包。

 (3)使用DatagramSocket类的receive( )方法接受数据包。

 注意:DatagramSocket类的receive( )方法是个阻塞方法,一直等待网络上的数据。

 4.3   Demo演示

 首先,需要写一个server,一个client。我们在client中发送一句话"hello , I am client",然后把这句话通过udp发送出去,在server端去接受udp消息,并且进行打印。


 以上是client端的代码,只是往2255端口发送一句"hello, I am client"。接下来是server端的代码。

同样,很简单,只是在server端监听2255端口,当有消息发送过来的时候,再去打印 ,运行后,可以直接在server端的console窗口看到打印的 server get : hello , I am client   表示成功,这只是最简单的方式。还可以在server端收到数据后,再给client返回数据,client同样去监听,然后获取数据。ps:一般与网络相关的代码都不会放在主线程中去处理,会新建一个线程去做处理。

五.TCP以及Demo

 tcp一般是用Socket类编写,也是分为server端,client端。两者是有主次之分的!两者的功能与编写方法大不一样。

 5.1 服务器程序创建一个ServerSocket,调用accept( )方法等待客户机的连接。
 5.2   客户端创建一个Socket,请求与服务器建立连接。
 5.3   服务器接受客户端的请求连接,同时创建一个新的Socket与客户建立连接。

 ps:ServerSocket一次可以与一个Socket连接,如果多台client同时请求,ServerSocket会把请求连接的Client放入一个队列中,队列默认大小是50,当超过50时,请求会被拒绝。

 5.4 Demo演示

 同样与UDP一样,首先写client端的代码,代码很简单,具体过程

public class TCPClient {
	Socket socket;
	BufferedWriter bufferedWriter;
	
	public void sendData() {
		try {
			InetAddress inetAddress = InetAddress.getLocalHost();//本例为示例,所以发送的地址均为本机
			int port = 8998;//定义发送的端口号
			socket = new Socket(inetAddress, port);//创建socket对象
			String mString = "Hello,YYQ";
			OutputStream outputStream = socket.getOutputStream();//socket绑定输出流
			outputStream.write(mString.getBytes());
			socket.close();//关闭socket
			outputStream.close();//关闭流
			
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	public static void main(String[] args) {
		TCPClient tcpClient = new TCPClient();
		tcpClient.sendData();
	}

}
以上就是是client端的代码,接下来是server端的代码

public class TCPServer {
	private BufferedReader bufferedReader; 
	private ServerSocket serverSocket;
	private Socket socket;
	
	public void receice() {
		try {
			serverSocket = new ServerSocket(8998);//ServerSocket监听8998端口,同时client发送到这个端口
			while(true) {
				System.out.println("等待客户机连接...");
				socket = serverSocket.accept();//建立socket连接,用serversocket的accept()方法。
				bufferedReader = new BufferedReader(
						new InputStreamReader(socket.getInputStream()));//socket中读取输入流
				System.out.println("从客户机读到的数据是: " + bufferedReader.readLine());
				
				try {
					if(bufferedReader != null) {
						bufferedReader.close();//关闭流
					}
					
					if(socket != null) {
						socket.close();//关闭socket
					}
					
				} catch (Exception e) {
					// TODO: handle exception
				}
			}
			
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	public static void main(String[] args) {
		TCPServer tcpServer = new TCPServer();
		tcpServer.receice();
	}
}
server端监听8998端口,当client没有发送数据的时候,会打印“等待客户机连接”,当收到数据的时候,会打印出来。

运行server端代码,之后运行client端代码。代码执行结果为:

等待客户机连接...
从客户机读到的数据是: Hello,YYQ
等待客户机连接...

已经表示server端成功收到client端的代码。

六.小结

 关于java 的网络通信已经全部介绍完毕,包括TCP/UDP。这篇文章只是最简单的示例与说明,更复杂的情况还需要工作中继续学习。本篇文章著作权是本人,如需转载,请联系本人,或者附上本文链接,谢谢合作!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值