[零基础学JAVA]Java SE应用部分-32.Java网络编程

简介:
C/S程序:表示的客户/服务器程序,每次需要编写两套程序 
|- MSN、QQ:一般会有两套程序,一个是服务器端,另外一个是客户端 
B/S程序:表示的浏览器/ 服务器,可以理解为动态WEB,论坛
本季目标
image
Sock:TCP通讯 
数据报:UDP通讯
Socket程序需要的类: 
1、所有的用户对于服务器来讲都是一个Socket客户端。 
2、在服务器上使用ServerSocket类接收客户端的Socket
Socket通信模型
image
Socket编程的四个基本步骤
image
编写一个服务器程序:ServerSocket
image
只要是网络连接都要求有一个端口 
public ServerSocket(int port) 
public Socket accept() throws IOException
通过此方法等待客户端的socket进行访问。
ServerSocket01服务器端代码:
image
此服务器端的功能非常的简单,就是接收客户端的请求,之后在屏幕上输出哈~
image
Windows中有一个telnet命令,通过此命令就可以直接连接到服务器了。
image
客户端收到 http://redking.blog.51cto.com字符串,同时服务器端显示“客户端回应完毕~~~”
image
只要是符合网络的协议标准,所有的客户端都可以连接到此服务器端上。 
但是一般情况下,很少说直接去使用telnet连接,往往会编写一个客户端。 
Socket 
public Socket(String host,int port) throws UnknownHostException,IOException 
指定一个主机的IP地址和一个端口
ClientSocket01客户端代码:
image
验证下效果,和telnet一样哈~
image
以上代码验证了,程序需要编写两套程序: 
· 一个是服务器端 
· 另外一个是客户端
现在发现所有的代码只是执行一次就完了,那么能不能说执行多次呢?由我的用户可以自己发出中断的指令。 
这样的做法我们可以做一个Socket经典 —— Echo程序 
用户发什么内容,服务器就会回应什么内容:
EchoServer代码:
import java.io.*;    
import java.net.*;    
public  class EchoServer{    
         //此处为了省去处理try...catch直接抛出了异常    
         public  static  void main(String args[])  throws Exception{    
                ServerSocket server =  null;    
                 //输出肯定使用打印流    
                PrintStream out =  null;    
                 //服务器肯定也要接收输入    
                BufferedReader buf =  null;    
                 //1.实例化一个服务器的监听端    
                server =  new ServerSocket(9999);    
                 //可以使用一种死循环的方式接收内容    
                Socket client =  null;    
                 while ( true){    
                         //不断接收内容    
                        client = server.accept();    
                         //准备好向客户端输出内容    
                        out =  new PrintStream(client.getOutputStream());    
                         //而且客户端要有输入给服务器端    
                        buf =  new BufferedReader( new InputStreamReader(client.getInputStream()));    
                         //下面先给出一个完整的信息提示    
                        out.println( "您好!欢迎光临:http://redking.blog.51cto.com");    
                        out.println("输入bye表示退出哈~");    
                        //一个用户要发很多的信息    
                        while (true){    
                                //接收客户端发送而来的内容    
                                String str = buf.readLine();    
                                if (str==null){    
                                        //如果str为空就表示退出    
                                        break;    
                                }else{    
                                        //如果输入的是bye则表示系统退出    
                                        if ("bye".equals(str)){    
                                                break;    
                                        }    
                                        //可以对用户发来的信息进行回应    
                                        out.println("ECHO:"+str);    
                                }    
                        }    
                        //进行收尾工作    
                        out.close();    
                        buf.close();    
                        client.close();    
                        //如果要关闭服务器时可以设置标志    
                        //server.close();    
                }    
        }    
}
看下效果:
image
现在我们用telnet连接上去看下效果
image
输入bye退出连接
image
同时可以多次连接
image
典型的包含了输入和输出
EchoClient代码:
import java.io.*;    
import java.net.*;    
public  class EchoClient{    
         public  static  void main(String args[])  throws Exception{    
                Socket client =  null;    
                BufferedReader buf =  null;    
                PrintStream out =  null;    
                 //1.连接服务器    
                client =  new Socket( "localhost",9999);    
                 //接收服务器端的输入信息    
                buf =  new BufferedReader( new InputStreamReader(client.getInputStream()));    
                System.out.println(buf.readLine());    
                System.out.println(buf.readLine());    
                 //之后准备从键盘接收数据    
                BufferedReader in =  new BufferedReader( new InputStreamReader(System.in));    
                String userInput =  null;    
                out =  new PrintStream(client.getOutputStream());    
                 while ((userInput=in.readLine())!= null){    
                         //表示有内容进来,要把内容发送到客户端    
                        out.println(userInput);    
                         //接收服务器端的回应    
                        System.out.println(buf.readLine());    
                }    
                out.close();    
                in.close();    
                client.close();    
        }    
}
image
但是此程序有一个问题,即:当一个用户操作的时候,其他用户是不能操作的 
程序是单线程的,所以每次只能一个用户访问。 
此处如果想解决,则只能使用多线程进行操作。 
首先需要编写一个线程的类:
ThreadServer代码:
import java.io.*;    
import java.net.*;    
public  class ThreadServer  implements Runnable{    
         //现在所有的Socket都要归入到一个线程之中    
         private Socket client =  null;    
         public ThreadServer(Socket client){    
                 this.client = client;    
        }    
         public  void run(){    
                 //要不断的接收客户发送来的信息    
                String input =  null;    
                 //通过BufferedReader进行接收    
                BufferedReader buf =  null;    
                 //有一个输出的对象    
                PrintStream out =  null;    
                 try{    
                        buf =  new BufferedReader( new InputStreamReader( this.client.getInputStream()));    
                         while( true){    
                                 //接收发送过来的信息    
                                input = buf.readLine();    
                                out =  new PrintStream( this.client.getOutputStream());    
                                 if ( "bye".equals(input)){    
                                         break;    
                                } else{    
                                        out.println( "ECHO:"+input);    
                                }    
                        }    
                         this.client.close();    
                } catch (Exception e){}    
        }    
}
EchoServer01服务器端代码: 
import java.io.*;    
import java.net.*;    
public  class EchoServer01{    
         //此处为了省去处理try...catch直接抛出了异常    
         public  static  void main(String args[])  throws Exception{    
                ServerSocket server =  null;    
                 //输出肯定使用打印流    
                PrintStream out =  null;    
                 //服务器肯定也要接收输入    
                BufferedReader buf =  null;    
                 //1.实例化一个服务器的监听端    
                server =  new ServerSocket(9999);    
                 //可以使用一种死循环的方式接收内容    
                Socket client =  null;    
                 while ( true){    
                         //不断接收内容    
                        client = server.accept();    
                         //在此处启动了一个线程    
                         new Thread( new ThreadServer(client)).start();    
                }    
        }    
}
使用telnet测试效果哈~
image 
通过以上代码,可以发现,多线程实际上在服务器上是比较常用的。 
服务器 = 多线程 + IO + Socket 
Socket程序实际上是属于TCP程序,是一个稳定的连接
 
UDP程序:数据报程序
image
Send发送端代码:
import java.io.*;    
import java.net.*;    
public  class Send{    
         public  static  void main(String args[])  throws Exception{    
                DatagramSocket ds =  null;    
                DatagramPacket dp =  null;    
                 //发送端必须有一个监视的端口    
                ds =  new DatagramSocket(9999);    
                String str =  "http://redking.blog.51cto.com";    
                //发送的内容只能是byte数组    
                //接收端端口号是8888    
                dp = new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("localhost"),8888);    
                ds.send(dp);    
                ds.close();    
        }    
}
看下效果:
image
信息已经发送出去了哈~
下面我们再写个接收代码
image
Receive接收端代码:
import java.io.*;    
import java.net.*;    
public  class Receive{    
         public  static  void main(String args[])  throws Exception{    
                DatagramSocket ds =  null;    
                DatagramPacket dp =  null;    
                 //要有一个空间大小    
                 byte b[] =  new  byte[1024];    
                 //ds的监听端口就表示发送端指定好的    
                ds =  new DatagramSocket(8888);    
                dp =  new DatagramPacket(b,b.length);    
                 //开始接收    
                ds.receive(dp);    
                System.out.println( new String(dp.getData()).trim());    
                ds.close();    
        }    
}
现在我们测试一下哈~首先必须接收端开启着
image
然后我们运行发送端发送信息
image
总结 
网络编程在实际中确实使用越来越少,JAVA的主要特点全部集中在了JAVA WEB上了。 
只需要了解以下概念即可: 
· 网络程序的分类:TCP、UDP 
· 服务器 = IO + Socket + Thread
###################################################






本文转自redking51CTO博客,原文链接:http://blog.51cto.com/redking/135374 ,如需转载请自行联系原作者
相关文章
|
10天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
11天前
|
缓存 算法 Java
Java内存管理与调优:释放应用潜能的关键
【4月更文挑战第2天】Java内存管理关乎性能与稳定性。理解JVM内存结构,如堆和栈,是优化基础。内存泄漏是常见问题,需谨慎管理对象生命周期,并使用工具如VisualVM检测。有效字符串处理、选择合适数据结构和算法能提升效率。垃圾回收自动回收内存,但策略调整影响性能,如选择不同类型的垃圾回收器。其他优化包括调整堆大小、使用对象池和缓存。掌握这些技巧,开发者能优化应用,提升系统性能。
|
10天前
|
Java
深入理解Java并发编程:线程池的应用与优化
【4月更文挑战第3天】 在Java并发编程中,线程池是一种重要的资源管理工具,它能有效地控制和管理线程的数量,提高系统性能。本文将深入探讨Java线程池的工作原理、应用场景以及优化策略,帮助读者更好地理解和应用线程池。
|
17天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
在开发高性能的Android应用时,选择合适的编程语言至关重要。近年来,Kotlin因其简洁性和功能性受到开发者的青睐,但其性能是否与传统的Java相比有所不足?本文通过对比分析Kotlin与Java在Android平台上的运行效率,揭示二者在编译速度、运行时性能及资源消耗方面的具体差异,并探讨在实际项目中如何做出最佳选择。
16 4
|
1天前
|
Java
探秘jstack:解决Java应用线程问题的利器
探秘jstack:解决Java应用线程问题的利器
9 1
探秘jstack:解决Java应用线程问题的利器
|
3天前
|
JavaScript Java 测试技术
基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)
8 0
基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)
|
4天前
|
传感器 监控 安全
|
4天前
|
安全 SDN 数据中心
|
4天前
|
安全 网络安全 网络虚拟化
虚拟网络设备与网络安全:深入分析与实践应用
在数字化时代📲,网络安全🔒成为了企业和个人防御体系中不可或缺的一部分。随着网络攻击的日益复杂和频繁🔥,传统的物理网络安全措施已经无法满足快速发展的需求。虚拟网络设备🖧,作为网络架构中的重要组成部分,通过提供灵活的配置和强大的隔离能力🛡️,为网络安全提供了新的保障。本文将从多个维度深入分析虚拟网络设备是如何保障网络安全的,以及它们的实际意义和应用场景。
|
5天前
|
XML JSON JavaScript
Java中XML和JSON的比较与应用指南
本文对比了Java中XML和JSON的使用,XML以自我描述性和可扩展性著称,适合结构复杂、需验证的场景,但语法冗长。JSON结构简洁,适用于轻量级数据交换,但不支持命名空间。在Java中,处理XML可使用DOM、SAX解析器或XPath,而JSON可借助GSON、Jackson库。根据需求选择合适格式,注意安全、性能和可读性。
21 0