JAVA网络编程与经典案例Echo
2019-08-08 18:58
543 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/z_xiaozhuo/article/details/98883048
Java的网络概念,不是以主机来区分的,而是以进程来区分,JVM帮助解决网络传输,不需要我们考虑。
虽然JVM帮助用户隐藏网络原始信息,但是有一些操作还是留给用户来实现啦,网络的连接分为两种:TCP(可靠的数据连接)、UDP(不可靠的数据连接)
从网络编程的本质来讲也分为两种结构:
1、C/S结构(客户端、服务器):需要开发两种程序,一套服务器程序,一套客户端程序,如果要更新需要开发两套程序,开发复杂的高,但是安全、稳定、因为可以自定义协议、自定义传输端口;
2、B/S结构(浏览器/服务器):通过浏览器来访问服务器端程序,开发者只需要开发服务器端代码即可,只需要维护服务器一套程序,由于使用的是公共的协议。公开的端口,所以安全性较差。
服务器端代码:
[code]public class HelloServer { public static void main(String[] args) throws Exception { //1、创建一个服务器对象,每一个服务器对象都必须要有一个监听端口 ServerSocket server=new ServerSocket(9999);//此时的服务在9999上,等待连接 System.out.println("等待客户连接............"); //2、需要等待客户连接,也就是说此时程序在此会进入到一个阻塞状态 Socket clietn=server.accept();//等待连接,连接的都是客户,每一个客户用Scoket表示 PrintWriter out=new PrintWriter(clietn.getOutputStream()); out.println("Hello World"); out.close(); server.close(); } }
客户端代码:
[code]import java.net.Socket; import java.util.Scanner; public class HelloClent { @SuppressWarnings("resource") public static void main(String[] args) throws Exception { //表示连接的指定服务器端的主机名称和端口 Socket client=new Socket("localhost",9999); Scanner sc=new Scanner(client.getInputStream()); sc.useDelimiter("\n"); while(sc.hasNext()){ System.out.println(sc.next()); } client.close(); } }
经典案例:Echo
利用多线程实现一个服务器多台主机
服务器端:
[code]import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class EchoServer { public static void main(String[] args) throws Exception { ServerSocket server = new ServerSocket(8888); boolean flag=true; while(flag){ Socket client = server.accept(); // 等待程序连接 new Thread(new MyThread(client)).start();; } server.close(); } private static class MyThread implements Runnable { private Socket client; public MyThread(Socket client) { super(); this.client = client; } @Override public void run() { try { Scanner sc = new Scanner(client.getInputStream()); // 接收客户端数据 PrintStream out = new PrintStream(client.getOutputStream()); // 对客户端的回应信息 sc.useDelimiter("\n");// 以空格为分割符 boolean flag = true; // 作为循环标记 while (flag) { // 相当于一直循环 if (sc.hasNext()) { String str = sc.next().trim();// 防止有多余空格出现 if ("byebye".equalsIgnoreCase(str)) { // 操作结束 out.println("BYEBYE!!!" + str); // 做出回应 flag = false; // 表示循环结束 break; // 退出循环 } out.println("ECHO:" + str); // 做出回应 } } out.close(); sc.close(); } catch (Exception e) { e.printStackTrace(); } } } }
客户端
[code]import java.io.PrintStream; import java.net.Socket; import java.util.Scanner; public class EchoClient { public static void main(String[] args) throws Exception { Socket cliten = new Socket("localhost", 8888); Scanner keyScan = new Scanner(System.in); // 用户输入 keyScan.useDelimiter("\n"); Scanner netScan = new Scanner(cliten.getInputStream()); netScan.useDelimiter("\n"); PrintStream netOut = new PrintStream(cliten.getOutputStream()); boolean flag = true; String str=null; while (flag) { System.out.print("请输入要发送的信息:"); if (keyScan.hasNext()) { str = keyScan.next().trim(); netOut.println(str); //发送给服务器端 if(netScan.hasNext()){ //服务器有回应 System.out.println(netScan.next()); } }if ("byebye".equals(str)) { flag = false; break; } } cliten.close(); keyScan.close(); netScan.close(); } }
相关文章推荐
- JAVA网络编程叶存菜鸟TCP程序设计笔记echo程序经典案列
- java网络编程和io,多线程结合完成文件上传和下载案例
- Java中Thread的经典面向编程案例
- java 接口回调经典案例--网络请求回调
- Java基础知识强化之网络编程笔记07:TCP之服务器给客户端一个反馈案例
- Java网络编程之Netty入门案例-yellowcong
- 实现字符和Unicode码互换 (Java经典编程案例)
- Java学习图形界面+网络编程案例---------网络简易通讯
- Java学习笔记53(网络编程:TCP协议案例)
- 把小写金额转成大写金额 (Java经典编程案例)
- 案例三:java网络编程(对象流传输)
- Java基础知识强化之网络编程笔记04:UDP之发送端的数据来自于键盘录入案例
- JAVA网络编程UDP案例
- java网络编程之服务端客户端socket简单通信案例
- Java网络编程案例--CS模型的简单实现
- JAVA_50经典编程案例之题目:809*??=800*??+9*??+1其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。
- java学习之网络编程之echo程序
- Java网络编程之组播小案例
- Java网络编程(ECHO案列)
- 从一组姓名中随机抽取幸运观众的代码实现 (Java经典编程案例)