[零基础学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 ,如需转载请自行联系原作者
相关文章
|
2天前
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
【7月更文挑战第25天】在网络应用蓬勃发展的数字时代,Python凭借其简洁的语法和强大的库支持成为开发高效应用的首选。本文通过实时聊天室案例,介绍了Python Socket编程的基础与进阶技巧,包括服务器与客户端的建立、数据交换等基础篇内容,以及使用多线程和异步IO提升性能的进阶篇。基础示例展示了服务器端监听连接请求、接收转发消息,客户端连接服务器并收发消息的过程。进阶部分讨论了如何利用Python的`threading`模块和`asyncio`库来处理多客户端连接,提高应用的并发处理能力和响应速度。掌握这些技能,能使开发者在网络编程领域更加游刃有余,构建出高性能的应用程序。
10 3
|
1天前
|
关系型数据库 Java 分布式数据库
PolarDB产品使用问题之部署到服务器上的Java应用(以jar包形式运行)无法连接,如何解决
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
2天前
|
存储 SQL 安全
网络安全漏洞解析与加密技术应用
随着信息技术的迅猛发展,网络安全问题日益凸显。本文深入探讨了网络安全漏洞的成因及其对信息安全的影响,重点分析了加密技术在防御网络攻击中的关键作用,同时强调了提升个人和组织安全意识的重要性。通过案例分析和技术讲解,旨在为读者提供全面、深入的网络安全知识分享。
10 2
|
5天前
|
缓存 安全 算法
Java内存模型深度解析与实践应用
本文深入探讨Java内存模型(JMM)的核心原理,揭示其在并发编程中的关键作用。通过分析内存屏障、happens-before原则及线程间的通信机制,阐释了JMM如何确保跨线程操作的有序性和可见性。同时,结合实例代码,展示了在高并发场景下如何有效利用JMM进行优化,避免常见的并发问题,如数据竞争和内存泄漏。文章还讨论了JVM的垃圾回收机制,以及它对应用程序性能的影响,提供了针对性的调优建议。最后,总结了JMM的最佳实践,旨在帮助开发人员构建更高效、稳定的Java应用。
|
5天前
|
机器学习/深度学习 人工智能 安全
人工智能在网络安全领域的应用与挑战
随着人工智能技术的飞速发展,其在网络安全领域的潜在价值逐渐显现。AI技术不仅能够提高网络威胁检测的精确度和响应速度,还能预测并防御未来潜在的攻击。然而,AI技术的引入也带来了新的安全风险,如模型欺骗、数据泄露等。本文将探讨AI在网络安全中的应用及其带来的挑战。
|
5天前
|
机器学习/深度学习 人工智能 监控
|
8天前
|
达摩院 安全 调度
网络流问题--交通调度【数学规划的应用(含代码)】阿里达摩院MindOpt
本文探讨了如何利用数学规划工具MindOpt解决交通调度问题。交通调度涉及网络流分析,考虑道路容量、车辆限制、路径选择等因素,以实现高效运行。通过建立数学模型,利用MindOpt云平台和建模语言MAPL,设定流量最大化目标并确保流量守恒,解决实际的调度问题。案例展示了如何分配车辆从起点到终点,同时满足道路容量约束。MindOpt Studio提供在线开发环境,支持模型构建和求解,帮助优化大规模交通调度。
|
1天前
|
机器学习/深度学习 人工智能 监控
|
3天前
|
供应链 安全 Java
以典型 Java 应用为例,完整的软件供应链会包含什么
以典型 Java 应用为例,完整的软件供应链会包含什么
7 0