<强> java基础知识之网路通信总结强>
在这篇文章里,我们主要讨论如何使用Java实现网络通信,包括TCP通信,UDP通信,多播以及NIO。
<强> TCP连接强>
TCP的基础是套接字,在TCP连接中,我们会使用ServerSocket和插座,当客户端和服务器建立连接以后,剩下的基本就是对I/O的控制了。
我们先来看一个简单的TCP通信,它分为客户端和服务器端。
客户端代码如下:
简单的TCP客户端 进口java.net。*; 进口. io . *; 公开课SimpleTcpClient { 公共静态void main (String [] args)抛出IOException { Socket套接字=零; BufferedReader br=零; PrintWriter pw=零; BufferedReader brTemp=零; 试一试 { 套接字=新的套接字(InetAddress.getLocalHost (), 5678); br=new BufferedReader(新InputStreamReader (socket.getInputStream ())); pw=new PrintWriter (socket.getOutputStream ()); brTemp=new BufferedReader(新InputStreamReader(系统)); 而(真) { 字符串行=brTemp.readLine (); pw.println(线); pw.flush (); 如果(line.equals(“结束”))休息; System.out.println (br.readLine ()); } } 捕获(异常交货) { System.err.println (ex.getMessage ()); } 最后 { 如果(套接字!=null) socket.close (); 如果(br !=null) br.close (); 如果(brTemp !=null) brTemp.close (); 如果(pw !=null) pw.close (); } } }
服务器端代码如下:
简单版本TCP服务器端 进口java.net。*; 进口. io . *; 公开课SimpleTcpServer { 公共静态void main (String [] args)抛出IOException { 考察一下服务器=零; 套接字客户=零; BufferedReader br=零; PrintWriter pw=零; 试一试 { 服务器=考察(5678); 客户=server.accept (); br=new BufferedReader(新InputStreamReader (client.getInputStream ())); pw=new PrintWriter (client.getOutputStream ()); 而(真) { 字符串行=br.readLine (); pw。println(“回复:“+线); pw.flush (); 如果(line.equals(“结束”))休息; } } 捕获(异常交货) { System.err.println (ex.getMessage ()); } 最后 { 如果(服务器!=null) server.close (); 如果(客户!=null) client.close (); 如果(br !=null) br.close (); 如果(pw !=null) pw.close (); } } }
这里的服务器的功能非常简单,它接收客户端发来的消息,然后将消息”原封不动”的返回给客户端。当客户端发送“结束”时,通信结束。
上面的代码基本上勾勒了TCP通信过程中,客户端和服务器端的主要框架,我们可以发现,上述的代码中,服务器端在任何时刻,都只能处理来自客户端的一个请求,它是串行处理的,不能并行,这和我们印象里的服务器处理方式不太相同,我们可以为服务器添加多线程,当一个客户端的请求进入后,我们就创建一个线程,来处理对应的请求。
改善后的服务器端代码如下:
多线程版本的TCP服务器端 进口java.net。*; 进口. io . *; 公开课SmartTcpServer { 公共静态void main (String [] args)抛出IOException { 考察一下服务器=考察(5678); 而(真) { 套接字客户=server.accept (); 线程的线程=new ServerThread(客户端); thread.start (); } } } 类ServerThread扩展了线程 { 私人Socket套接字=零; 公共ServerThread (Socket套接字) { 这一点。套接字=套接字; } 公共空间run () { BufferedReader br=零; PrintWriter pw=零; 试一试 { br=new BufferedReader(新InputStreamReader (socket.getInputStream ())); pw=new PrintWriter (socket.getOutputStream ()); 而(真) { 字符串行=br.readLine (); pw。println(“回复:“+线); pw.flush (); 如果(line.equals(“结束”))休息; } } 捕获(异常交货) { System.err.println (ex.getMessage ()); } 最后 { 如果(套接字!=null) 尝试{ socket.close (); }捕捉(IOException e1) { e1.printStackTrace (); } 如果(br !=null) 尝试{ br.close (); }捕捉(IOException e) { e.printStackTrace (); } 如果(pw !=null) pw.close (); } } }java基础知识之网络通信(TCP通信,UDP通信,多播以及NIO)总结