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学习总结:52(Java网络编程)相关推荐

  1. Java学习笔记53(网络编程:TCP协议案例)

    简易的案例 客户端: package demo;import java.io.IOException; import java.io.InputStream; import java.io.Outpu ...

  2. java小球碰撞实验报告_20155317 《Java程序设计》实验五网络编程与安全实验报告...

    20155317 <Java程序设计>实验五网络编程与安全实验报告 遇到问题 在刚开始启动客户端或者服务端时,出现了一系列的错误情况,总是提示异常信息 后来经过询问同学,反应将端口号修改一 ...

  3. Java核心类库篇8——网络编程

    Java核心类库篇8--网络编程 1.七层网络模型 OSI(Open System Interconnect),即开放式系统互联,是ISO(国际标准化组织)组织在1985 年研究的网络互连模型. 当发 ...

  4. java自动化测试语言高级之网络编程

    java自动化测试语言高级之网络编程 文章目录 java自动化测试语言高级之网络编程 Java 网络编程 Java 网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来 ...

  5. Java学习笔记 六、面向对象编程中级部分

    Java学习笔记 六.面向对象编程中级部分 包 包的注意事项和使用细节 访问修饰符 访问修饰符的注意事项和使用细节 面向对象编程三大特征 封装 封装的实现步骤(三步) 继承 继承的细节问题 继承的本质 ...

  6. Java的IO模型基于网络编程利弊分析

    JAVA的IO模型基于网络编程利弊分析 一.IO通俗理解 IO的过程 思考①答案:文件句柄 思考②答案: 阻塞/非阻塞 IO(程序对内核空间数据拷贝到用户空间阶段的耗时操作的等待方式) 同步/异步IO ...

  7. Java学习系列(十)Java面向对象之I/O流(上)

    IO流 我们知道应用程序运行时数据是保存在内存中的,但由于内存中的数据不可持久保存(如断电或程序退出时数据会丢失),因此需要一种手段将数据写入硬盘或读入内存.面向IO流编程就是一种很好的选择.IO:I ...

  8. bytes数组转string指定编码_好程序员Java学习路线分享Java基础之string

    好程序员Java学习路线分享Java基础之string 好程序员Java培训 先来讲一下字符串 字串符分类: 不可变字符串:----String.字符串本身不能发生改变,与指向字符串的引用无关. St ...

  9. Java学习笔记1:Java中有关print、println、printf的用法和区别

    Java学习笔记1:Java中有关print.println.printf的用法和区别 最近在学习java,写一些笔记记录下. 1.print()函数是一般的标准输出,但是不换行. 2.println ...

  10. Java学习07:Java面向对象

    Java学习07: Java面向对象: 链接:https://pan.baidu.com/s/1gzlBk5OOVI6oEv-WOkHuhQ  提取码:iqov

最新文章

  1. [转载] 七龙珠第一部——第004话 掳人的妖怪——乌龙
  2. Linux之磁盘管理,分区
  3. 得到INSERT和UPDATE中使用的值
  4. Vim文件管理器NERD tree
  5. tar:文件打包归档
  6. netty服务器返回信息关闭,netty4 服务端同步客户端返回的结果
  7. 变量详解-----笔记
  8. mysql表连接_mysql表连接
  9. java 自动启动监听_Spring Boot 启动事件和监听器,太强大了!
  10. python私人定制_手把手教你学python第十五讲(魔法方法续私人“定制”)
  11. Spring: @Import @ImportResource引入资源
  12. 深度学习入门者选择开源框架丨硬创公开课群友问答
  13. gcc include lib路径扩展
  14. 松下服务器a5系列,松下 A5系列)MADHT1505 伺服驱动器
  15. LeetCode 520. Detect Capital
  16. 有源淹没分析arcgis_基于DEM的有源洪水淹没分析算法
  17. python程序实现分析_Python编程快速上手——疯狂填词程序实现方法分析
  18. MapReduce实现矩阵乘法的一些总结
  19. C语言散列法求英文字母字符串求余,c语言求余数
  20. DCloud的uniapp如何实现微信刷脸支付

热门文章

  1. 元宇宙开发:你在虚幻引擎中的第一个虚拟现实游戏
  2. 数据结构 -- 图与图存储
  3. awk1.0 — awk基础
  4. 前端优化系列之一:dns预获取 dns-prefetch 提升页面载入速度
  5. Redis集群官方推荐方案 Redis-Cluster
  6. Ajax基础讲解 1
  7. Android studio 第二次作业
  8. EBS 抓trace 文件
  9. 【C++】动态内存管理/move/以及移动构造与移动赋值运算符
  10. Java判断文本文件编码格式以及读取