前面讲了,网络连接分为TCP连接和UDP连接,相应的,一般的网络编程分为TCP和UDP编程。作为一个初学者,首先需要了解的是TCP编程。
那么TCP编程到底是神马玩意?
TCP编程又叫做Socket编程(UDP也有Socket,但比较特殊,叫数据报式Socket,与这里的Socket有很大的不同。这里的Socket是流式Socket)。简单的说,TCP编程就是运用Socket的概念实现的面向连接的网络编程。Socket编程的概念用的很广,Windows上的网络编程叫做Socket编程,Linux上的网络编程也叫做Socket编程,当然Java中的网络编程也叫Socekt编程(这不是废话么!!!)
二个Java应用程序课通过一个双向的网络连接实现数据交互,这个网络链接的一端叫做一个Socket。
Socket的术语翻译是套接字,这个翻译不好理解。Socket的原版英文意思是"插座",事实上,我认为这个翻译还好些,比较形象:我们可以把无形的网络连接看做是有形的网线,Socket就是我们电脑上的网线插孔。
PS:小知识,Socket的开发包最初由 Berkeley大学的工作者开发出来,并在随后广泛运用于各种OS,各种语言(包括C,C++等)上的网络开发。在此,我们要向 Berkeley大学以及它为计算机界作出的伟大贡献致敬。
花开二朵,各表一支。不扯远了,接下来是Java中用Socket简单实现Server——Client通信模型,这是网络通信中的最最基本模型。
我们说,客户端Client是为客户写的,通过客户端,客户就能享受到程序提供的服务,比如,我们平常使用的QQ就是一个客户端,通过它,我们能聊天,群聊等等。服务端Server的作用是处理客户端发来的消息,并进行处理,还是用QQ举例子,它的服务端我们是接触不到的,但是我们在用我们电脑上的QQ客户端(好别扭哦,还是QQ吧),我们用QQ登陆时,便会向QQ服务端发送消息,服务端接收到消息后,分析消息,当消息格式正确,并且账号,密码都正确时,服务端便允许我们正常享受服务。
在Java中,我们说一个服务端就是一个java.net.ServerSocket对象。比如:
java.net.ServerSocket server = new java.net.ServerSocket(10000);
就创建了一个服务端,传入的参数就是这个程序所占用的端口号port。
当然,这个时候还只是创建了服务端,这个服务端并不能连接,我们可以这样:
java.new.Socket serverSocker = server.accept();
这不就创建了一个新的Scoket了么!!不过需要注意的是server.accept()是阻塞式的。意思是,当有"东西"试图连接上来的时候,该方法才会执行,否则,线程会卡到那。阻塞这个概念在以前学习的IO流当中也出现过。
接下来,我们来编写客户端Client来连接server。另写一个程序,注意,是另写一个程序,不是仅仅写另一个类。这样:
Socket clientSocket = new Socket(IP,port);
IP是运行Server程序的计算机的IP地址,我们可以通过在命令提示符中输入ipconfig来查询,同理,port是运行Server程序的端口号,我们这里是10000。当这句话执行时,便是与server建立了连接。
至此,Server——Client连接便建立起来了。
结束?? 没有啦,我们还没有传输数据啦
传输数据是通过IO流实现的。如Server端的IO可这样得到:
java.net.OutputStream ous = server.getOutputStream();得到输出流
java.net.InputStream in = server.getInputStream(); 得到输入流
客户端的IO流也同理得到。
然后我们便可以由以前学过的IO流只是来传输数据了。
最后,上面的程序还是有问题的,不能同时实现接收和发送,解决的办法便是线程Thread。具体实现略。同时,在上面的Socket serverSocket = server.accpt();外面加一个循环就能实现服务端与多个客户端的通信了。
加一句,通信过程中的流程大家一定要弄清楚,别到时2边都阻塞住了,程序便"死"了,那就不好了。