Java学习总结:52(Java网络编程)
Java网络编程
开发第一个网络程序
java.net包提供了网络编程有关的开发工具类,在此包中有一下两个主要的核心操作类。
- ServerSocket类:是一个封装支持的TCP协议的操作类,主要工作在服务器端,用于接收客户端请求;
- Socket类:也是一个封装了TCP协议的操作类,每一个Socket对象都表示一个客户端。
ServerSocket类的常用方法
No. | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public ServerSocket(int port) throws IOException | 构造 | 开辟一个指定的端口监听,一般使用5000以上的端口 |
2 | public Socket accept() throws IOException | 普通 | 服务器端接收客户端请求,通过Socket返回 |
3 | public void close() throws IOException | 普通 | 关闭服务器端 |
Socket类的常用方法
No. | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public Socket(String host, int port) throws UnknownHostException,IOException | 构造 | 指定要连接的主机(IP地址)和接口,host代表主机的IP地址,如果是本机直接访问,则使用localhost(127.0.0.1)代替IP |
2 | public OutputStream getOutputStream() throws IOException | 普通 | 取得指定客户端的输出对象,使用PrintStream操作 |
3 | public InputStream getInputStream() throws IOException | 普通 | 从指定的客户端读取数据,使用Scanner操作 |
在客户端,程序可以通过Socket类的getInputStream()方法,取得服务器的输出信息,在服务器端可以通过getOutputStream()方法取得客户端的输出信息。
例:定义服务器端
package Project.Study.ServerSocket;import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;public class Test1 {public static void main(String[]args)throws Exception{ServerSocket server = new ServerSocket(9999); //所有的服务器必须有接口System.out.println("等待客户端连接...");Socket socket = server.accept(); //等待客户端连接//OutputStream并不方便进行内容的输出,所以利用打印流完成输出PrintStream out = new PrintStream(socket.getOutputStream());out.println("Hello World!!!"); //输出数据out.close();socket.close();server.close();}
}
//结果:
//等待客户端连接...(此处讲出现堵塞情况,一直到客户端连接后才会继续执行)
本程序在本机的9999端口上设置了一个服务器的监听操作(accept()方法表示打开服务器监听),这样当有客户端通过TCP连接方式连接到服务器端后,服务器端将利用PrintStream输出数据,当数据输出完毕后该服务器就将关闭,所以本次定义的服务器只能处理一次客户端的请求。
例:编写客户端
package Project.Study.Socket;import java.net.Socket;
import java.util.Scanner;public class Test1 {public static void main(String[]args)throws Exception{Socket socket = new Socket("localhost",9999);//连接服务器//取得客户端的输入数据流对象,表示接收服务器端的输出信息Scanner scanner = new Scanner(socket.getInputStream());scanner.useDelimiter("\n"); //设置分隔符if (scanner.hasNext()){ //判断是否有数据System.out.println("回应数据:"+scanner.next());//取出数据}scanner.close();socket.close();}
}
//结果:
//回应数据:Hello World!!!
在TCP程序中,每一个Socket对象都表示一个客户端的信息,所以客户端程序要连接也必须依靠Socket对象操作。在实例化Socket类对象时必须设置要连接的主机名称(本机为localhost,或者填写IP地址)以及连接端口号,当连接成功后就可以利用Scanner进行输入流数据的读取,接收服务器端的回应信息。
网络开发的经典模型——Echo程序
例:实现服务器端
package Project.Study.ServerSocket;import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;public class Test2 {public static void main(String[]args)throws Exception{ServerSocket serverSocket = new ServerSocket(9999); //定义连接端口Socket socket = serverSocket.accept(); //等待客户连接//得到客户端输入的数据以及向客户端输出数据的对象,利用扫描流接收,打印流输出Scanner scanner = new Scanner(socket.getInputStream());PrintStream out = new PrintStream(socket.getOutputStream());boolean flag = true; //设置循环标记while (flag){if (scanner.hasNext()){ //是否有内容输入String str = scanner.next().trim(); //得到客户端发送的内容,并删除空格if (str.equalsIgnoreCase("####")){ //程序结束标记out.println("再见!"); //输出结束信息flag = false; //退出循环}else{ //回应输入信息out.println("ECHO:"+str); //加上前缀返回}}}scanner.close();out.close();socket.close();serverSocket.close();}
}
该服务器端存在一个缺陷,它是单线程的网络应用,所有的操作都是在主线程上进行的开发,所以只能连接一个客户端,不能连接其他客户端。
例:修改服务器端(使其可以同时处理多个客户端的连接操作)
package Project.Study.ServerSocket;import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;class EchoThread implements Runnable{ //建立线程类private Socket socket; //每个线程处理一个客户端public EchoThread(Socket socket){ //创建线程对象时传递Socketthis.socket=socket;}@Overridepublic void run(){try { //每个线程对象取得各自Socket的输入流与输出流Scanner scanner = new Scanner(socket.getInputStream());PrintStream out = new PrintStream(socket.getOutputStream());boolean flag = true; //控制多次接收操作while (flag){if (scanner.hasNext()){ //判断是否有内容String str = scanner.next().trim(); //得到客户端发送的内容if (str.equalsIgnoreCase("###")){//程序结束out.println("再见!");flag = false; //退出循环}else{ //应该回应输入信息out.println("ECHO:"+str); //回应信息}}}scanner.close();out.close();socket.close();}catch (Exception e){e.printStackTrace();}}
}
public class Test3 {public static void main(String[]args)throws Exception{ServerSocket serverSocket = new ServerSocket(9999);//在9999端口上监听boolean flag = true; //循环标记while (flag){ //接收多个客户端请求Socket socket = serverSocket.accept(); //客户端连接new Thread(new EchoThread(socket)).start(); //创建并启动新线程}serverSocket.close();}
}
例:定义客户端
package Project.Study.Socket;import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;public class Test2 {public static void main(String[]args)throws Exception{Socket socket = new Socket("localhost",9999); //服务器地址和端口Scanner input = new Scanner(System.in); //键盘输入数据//利用Scanner包装客户端输入数据(服务器端输出),PrintStream包装客户端输出数据Scanner scanner = new Scanner(socket.getInputStream());PrintStream out = new PrintStream(socket.getOutputStream());input.useDelimiter("\n"); //设置键盘输入分隔符scanner.useDelimiter("\n"); //设置回应数据分隔符boolean flag = true; //循环标志while (flag){System.out.println("请输入要发送的数据:");if (input.hasNext()){ //判断键盘是否输入数据String str = input.next().trim(); //取得键盘输入的数据out.println(str); //发送数据到服务器端if (str.equalsIgnoreCase("###")){ //结束标记flag = false; //结束循环}if (scanner.hasNext()){ //服务器有回应System.out.println(scanner.next()); //输出回应数据}}}input.close();scanner.close();out.close();socket.close();}
}
结果博主就不发了,自己在两个端口自问自答感觉有点怪。
相关文章:

聊聊高并发(十六)实现一个简单的可重入锁
可重入锁指的是假设一个线程已经获得了一个锁,那么它能够多次进入这个锁,当然前提是线程须要先获得这个锁。 可重入锁是最常使用的锁。Java的内置锁就是可重入锁,使用synchronizedkeyword能够启用内置锁机制,比方说一个类有两个sy…

2022-2028年中国蛋制品行业市场专项调查及前瞻分析报告
【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国蛋制品行业市场行业相关概述、中国蛋制品行业市场行业运行环境、分析了中国蛋制品行业市场…
Twisted入门教程(3)
第三部分:开始认识Twisted可以从这里从头开始阅读这个系列。用twisted的方式实现前面的内容最终我们将使用twisted的方式来重新实现我们前面的异步模式客户端。不过,首先我们先稍微写点简单的twisted程序来认识一下twisted。最最简单的twisted程序就是下…

openstack高可用方案
openstack高可用方案 HA 将服务分为两类: • 有状态服务:后续对服务的请求依赖于之前对服务的请求。OpenStack中有状态的服务包括MySQL数据库和AMQP消息队列。对于有状态类服务的HA,如neutron-l3-agent、neutron-metadata-agent、nova-comput…

3D游戏设计和创作工具学习教程 3D Game Design Creation Tools
语言:英语中英文字幕(根据原英文字幕机译更准确) 大小解压后:1.94G 1280X720 mp4 三维游戏设计和创作工具 用扎实的工作流程开始开发游戏 课程获取:3D游戏设计和创作工具学习教程 3D Game Design & Creation Too…

Java学习总结:53(单对象保存父接口:Collection)
单对象保存父接口:Collection java.util.Collection是进行单对象保存的最大父接口,即每次利用Collection接口都只能保存一个对象信息。单对象保存父接口定义如下: public interface Collection<E> extends Iterable<E>由该定义…
ORA-00942:表或视图不存在(低级错误)
在好多时候。调试PL/SQL对象时会报。ORA-00942 看看错误原因吧: 报错原因:1.该schema没有对表或者视图没有select权限 2.就是该对象不存在 解决的方法: 1.授权给对应对象 2.create table or view 转载于:https://www.cnblogs.com/blfshiye/p/…

2022-2028年中国蛋白石行业发展现状分析及投资前景趋势报告
【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国蛋白石行业市场行业相关概述、中国蛋白石行业市场行业运行环境、分析了中国蛋白石行业市场…

实验: VMware使用快照间接备份原始VMDK文件
资料上看的使用快照备份运行着的虚拟机 当虚拟机开着时,快照提供了一个备份原始 VMDK 文件的好办法。所有的写入操作在原始文件上暂停了,因此,复制它在另一个存储卷很安全。这就是像 VMware Consolidated Backup 和 Vizioncore 的 vRanger…

tomcat生成catalina.out文件
生成catalina.out方法 导语:本文为Windows下生tomcat将控制台信息输出到catalina.out文件 且 保证能实时查看日志文件的方法。 一、创建catalina.out 1、修改tomcat bin目录下的startup.bat文件 修改位置:在startup.bat文件倒数第二行 修改call "%…

Unity优化手机游戏学习教程
流派:电子学习| MP4 |视频:h264,1280720 |音频:AAC,48.0 KHz 语言:英语中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.69 GB |时长:6h 44m 创建移动游戏的优化技巧和技术 你会学到什么 如何优化手机游戏的图形和…

Java学习总结:54(集合输出)
集合输出 在Java中,集合的输出操作有四种形式:Iterator输出、ListIterator输出、foreach(加强型for循环)输出、Enumeration输出。 迭代输出:Iterator Iterator(迭代器)是集合输出操作中最常用的接口,而在Collection接口中也提供…

12.27评论5位同学试验三
23号李名贵,http://www.cnblogs.com/xieqiuyou/p/5017244.html#3323660 写的不错,每行语句都有注释,但截图不完整 24号施振成,http://www.cnblogs.com/nonecanstop/p/5079334.html 写的较完整,轮转法和优先算法都有用到…

2022-2028年中国袋式除尘用滤料行业市场全景评估及发展策略分析报告
【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国袋式除尘用滤料行业市场行业相关概述、中国袋式除尘用滤料行业市场行业运行环境、分析了中…

TL-WDN3321 Ubuntu 下安装
为什么80%的码农都做不了架构师?>>> The WiFi USB dongles based on the newest RT5572 chip set do not work out of the box on Ubuntu. Unex DNUR-V72, D-Link DWA-160 Rev B and TP-Link TL-WDN3200 dongles are based on this chipset. You will …

解决真机编译出现System.DllNotFoundException: 'libmono-native.so'错误都方法
1、去掉勾选:使用共享运行时 2 检查android SDK是否安装了NDK 3、使用真机运行编译APK 转载于:https://www.cnblogs.com/CelonY/p/11355417.html

Revit: Twinmotion工作流程学习
Revit: Twinmotion Workflow MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 技能等级:中级|语言:英语中英文字幕(根据原英文字幕机译更准确) |时长:1h 22m |大小解压后:2.93 GB 含课程文件 Twinmotion是…

Java学习总结:55(偶对象保存:Map接口)
偶对象保存:Map接口 我们前面讲到的Collection属于单值保存父接口,每次只能保存一个对象;而我们这节讲的Map属于偶对象保存接口,利用Map可以保存一对关联数据(按照"key value"的形式)。 Map接口的常用方法 No方法名…

WPF的图片操作效果(一):RenderTransform
一.RenderTransform类的成员: 1.TranslateTransform 平移效果 2.RotateTransform 旋转效果 3.ScaleTransform 缩放效果 4.SkewTransform 扭转效果 5.TransformGroup 组合效果 6.MatrixTransform 是其他几个变形类的基类…

2022-2028年中国大气污染防治产业投资分析及前景预测报告
【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国大气污染防治行业市场行业相关概述、中国大气污染防治行业市场行业运行环境、分析了中国大…

最近做手机端,GPS,微信QQ分享总结的问题
Android端 百度地图: 1.libs包中armeabi下liblocSDK4d.so文件丢失,导致百度定位失效。 微信分享: 1.分享App,app的内容(图片加描述)不能超过32kb ,不然无法分享。(直接跳至Oncancel事件中&#…

cap理论与分布式事务的解决方案
现在很火的微服务架构所设计的系统是分布式系统。分布式系统有一个著名的CAP理论,即一个分布式系统要同时满足一致性(Consistency)、可用性(Availablility)和分区容错(Partition Tolerance)三个…

Blender中的多平面动画学习教程
技能分享–Blender中的多平面动画 Skillshare – Multiplane Animation in Blender 语言:英语中英文字幕(根据原英文字幕机译更准确) 大小解压后:1.34G 含课程素材 信息: 我们将在这堂课中致力于创建一个2D多平面相机效果…

BestCoder Round #68 (div.2) 1002 tree
题意:给你一个图,每条边权值0或1,问每个点周围最近的点有多少个? 思路:并查集找权值为0的点构成的连通块。 1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 #include<math.h>…

Java学习总结:56(Stack子类)
Stack子类 Stack表示栈操作,栈也是一种动态对象数组,采用的是一种先进后出的数据结构形式,即在栈中最早保存的数据最后才会取出,而最后保存的数据可以最先取出。Stack类的定义如下: public class Stack<E>exte…

2022-2028年中国大理石料行业市场研究及前瞻分析报告
【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国大理石料行业市场行业相关概述、中国大理石料行业市场行业运行环境、分析了中国大理石料行…

ActionScript 3操作XML 详解
AS3引入了E4X ,它是根据ECMAScript标准处理XML 数据的全新机制。这使得程序员在程序中无缝地操作XML。在AS3中可以使用XML字面值将XML数据直接写入代码,该字面值将被自动解析。 一、AS3中的XML入门 1.可以将XML直接写入代码 public var employeelist:XML…

kubernetes关键特性和概述
kubernetes关键特性和概述 https://blog.csdn.net/u014042372/article/details/80573213 posted on 2019-08-16 11:23 竹径风声 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/girl1314/p/11362768.html

Blender创作你自己的动画短片学习教程
Filmmaking with Blender – Create your own animated Short Film 时长:1h 20m |视频:. MP4 1280720,30 fps(r) |音频:AAC,44100 Hz,2ch |大小:1G 语言:英语中英文字幕(根据原英文字幕机译更准确) 在本课…

Java学习总结:57(Properties子类)
Properties子类 Properties类本身是Hashtable的子类,但是由于Properties类都使用String数据类型进行操作,所以在使用Properties类时主要使用本类所定义的方法。Properties类常用方法如下: No.方法类型描述1public Object setProperty(Strin…