Java笔记:《Java语言程序设计》–郭克华
案例介绍
UDP是面向无连接的,但并不是没有客户端和服务端的区别。只是说,服务端运行之后,并不一定要等待客户端的连接才能通信,客户端可以直接和服务端通信,发送信息。
这里介绍一个聊天应用最基本的程序:客户端和服务器相同,都可以给对方发送信息,也能够自动接收对方发过来的信息。本程序效果如图所示。
“服务器端”和“客户端”对话框中都有一个文本框,输入聊天信息。输入聊天信息之后,单击“发送”按钮,就能够将信息发送给对方,对方也能够自动收到之后显示。
显然这个程序在利用TCP实现双向聊天博客中也有介绍,阅读本篇博客之后,可以比较两者之间的差异。
服务器和客户端是如何交互的
在聊天程序中,各聊天的界面叫做客户端,客户端之间如果要相互聊天,则可以将信息先发送到服务器端,然后由服务器端转发。因此,客户端先要连接到服务器。客户端连接到服务器的IP地址和端口。在服务器端,必须监听某个端口。在客户端,必须连接服务器的某个端口,这点没有太大区别。
1.服务端怎样打开并监听端口?
UDP编程中,端口的监听是由java.net.DatagramSocket进行管理的,打开java.net.DatagramSocket的文档,这个类有很多构造函数,最常见的构造函数为:
public DatagramSocket(int port) throws SocketExceptin
传入一个端口号,实例化DatagramSocket。
ps:实例化DatagramSocket,就已经打开了端口号并进行监听。
例如,如下代码就可以监听服务器上的9999端口,并返回连接对象ds。
DatagramSocket ds=new DatagramSocket(9999);
2.客户端是怎样连接到服务器端的某个端口?
客户端连接到服务器端的某个端口也是由java.net.DatagramSocket进行管理的,打开java.net.DatagramSocket的文档,里面有一个重要函数:
public void connect(InetAddress address,int port)
传入一个封装了服务器IP地址的InetAddress对象和端口号。
ps:java.net.InetAddress有一个函数:
public static InetAddress getByName(String host) throws UnknownHostException
这是一个静态函数,可以传入一个IP地址,返回InetAddress对象。
例如,如下代码就可以连接服务器218.197.118.80上的9999端口。
DatagramSocket ds=new DatagramSocket();
InetAddress add=InetAddress.getByteName("218.197.118.80");
ds.connect(add,9999);
特别提醒
到这里为止,会发现这岂不是和TCP编程一样?是的,看起来一样,但是本质却不一样。在TCP编程中,接下来的工作就是服务器要获得客户端的连接,然后通过这个连接来进行通信。但是,在UDP编程中,这个工作不要了!就可以直接通信了!也就是说,服务器端不需要获得客户端的连接,它们就直接通过地址来收发信息。因此服务器不需要知道客户端是否连上来了。或说的更加直接一些,客户端以下代码:
InetAddress add=InetAddress.getByName("218.197.118.80");
ds.connect(add,9999)