TCP通信
Socket --相当于“虚拟链路两端的插座”。Socket负责完成通信。
ServerSocket --它只负责“接收”连接。它用于产生Socket。

服务器端编程
1) 创建ServerSocket 对象,该对象负责“接收”连接。
2) 如果客户端有连接,ServerSocket 对象调用accept()方法返回一个Socket。
3) 通过IO流读取对方的信息,也可向对方发送数据。

客户端编程
1) new Socket()来建立与远程服务器的连接。
2) 通过IO流读取对方的信息,也可向对方发送数据。

举列说明1(简单通信):

/*** @author lhy* @description 服务器端*/
public class ServerTest {public static void main(String[] args) {PrintStream ps = null;try {// ServerSocket只负责“接收”连接,20000为端口号(标识该应用程序)ServerSocket ss = new ServerSocket(20000);System.out.println("服务器端等待连接...");// 接收连接,它会阻塞线程Socket socket = ss.accept();// ----------------------下面统一面向IO编程--------------------------//ps = new PrintStream(socket.getOutputStream());ps.println("ServerTest你好");} catch (IOException e) {e.printStackTrace();} finally {ps.close();}}}
/*** @author lhy* @description 客户端*/
public class ClientTest {public static void main(String[] args) {BufferedReader br = null;try {Socket socket = new Socket("192.168.0.8", 20000);// ----------------------下面统一面向IO编程--------------------------//br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line = null;while ((line = br.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();} finally {try {br.close();} catch (IOException e) {e.printStackTrace();}}}
}

举列说明2(控制台多人聊天):

服务器端:

public class ServerTest {static Set<Socket> clients = Collections.synchronizedSet(new HashSet<Socket>());public static void main(String[] args) {ServerSocket ss = null;try {ss = new ServerSocket(20000);System.out.println("服务器端等待连接...");while (true) {// 接收连接,它会阻塞线程Socket socket = ss.accept();clients.add(socket);// 启动线程new ServerThread(socket).start();}} catch (IOException e) {e.printStackTrace();} finally {try {ss.close();} catch (IOException e) {e.printStackTrace();}}}
}// 单独封装一个线程类
class ServerThread extends Thread {private Socket socket;public ServerThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {BufferedReader br = null;try {while (true) {// ----------------------下面统一面向IO编程--------------------------//br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line = null;while ((line = br.readLine()) != null) {for (Socket s : ServerTest.clients) {PrintStream ps = new PrintStream(s.getOutputStream());ps.println(line);// 输出各个客户端对应的Socket}}}} catch (IOException e) {e.printStackTrace();} finally {try {br.close();} catch (IOException e) {e.printStackTrace();}}}
}

客户端:

public class ChatServer {// 定义一个线程安全的Set集合public static Set<Socket> clients = Collections.synchronizedSet(new HashSet<Socket>());public static void main(String[] args) throws IOException {// ServerSocket只负责“接受”连接,不能通信// 该服务器程序就在30002端口监听ServerSocket ss = new ServerSocket(20000);System.out.println("服务器等待连接...");while (true) { // 这样保证每个客户端有一条线程// 接受连接。它会阻塞线程Socket socket = ss.accept();// 只要连接成功,它会返回socketclients.add(socket);// 每次客户端连接进来,就将该客户端添加到clients集合中System.out.println("当前用户数量:" + clients.size());new ServerThread(socket).start();}}
}class ServerThread extends Thread {private Socket socket;public ServerThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {// -----原來读文件,现在改为读网络,只要改节点try {BufferedReader socketBr = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line = null;// line代表从网络中读取数据while ((line = socketBr.readLine()) != null) {for (Iterator<Socket> it = ChatServer.clients.iterator(); it.hasNext();) {Socket s = it.next();try {PrintStream ps = new PrintStream(s.getOutputStream());ps.println(line);// 输出到各客户端对应的socket} catch (SocketException ex) {it.remove();// 捕获到该socket的异常,即表明Socket已经断开System.out.println("当前用户数量:" + ChatServer.clients.size());// ex.printStackTrace();}}}} catch (SocketException se) {ChatServer.clients.remove(socket);System.out.println("当前用户数量:" + ChatServer.clients.size()); } catch (Exception e) {e.printStackTrace();}}
}

小结:

System.in :读取键盘输入。包装方法:BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

socket.getInputStream():读取网络。包装方法:BufferedReadersocketBr = new BufferedReader(new InputStreamReader(socket.getInputStream()));

socket.getOutputStream():写入(输出到)网络。包装方法:PrintStream socketOut = new PrintStream(socket.getOutputStream());

System.out:输出到屏幕。

下面以之前IO讲的一张图来结束:

Java学习系列(十七)Java面向对象之开发聊天工具相关推荐

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

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

  2. Java学习系列(十三)Java面向对象之界面编程

    Java的界面编程 Java在客户端上表现并不突出,客户端往往都是局限在windows平台.AWT(JDK1.0发布,Sun希望在所有平台上都能运行),它并未为界面提供实现,直接调用的是操作系统上相应 ...

  3. Java学习系列(四)Java面向对象之修饰符、封装、继承、多态详解

    今天内容比较多,直接步入正题吧. 类和对象的定义 类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起.而对象是具有类类型的变量,存在于堆内存中.类是对象的抽象,而对 ...

  4. Java学习系列(十一)Java面向对象之I/O流(下)

    今天接着昨天的IO流讲,内容可能会比较多. DataInputStream与DataOutputStream 它们是建立在已有的IO的基础上的两个特殊的过滤流.规律:它们只是增加了一些特定的方法读取特 ...

  5. Java学习系列及数据结构博客全目录

    Java学习系列 Java学习系列(一)Java的运行机制.JDK的安装配置及常用命令详解 Java学习系列(二)Java注释.标识符.基本数据类型及其转换易错点详解 Java学习系列(三)Java运 ...

  6. Java学习系列(十八)Java面向对象之基于UDP协议的网络通信

    UDP协议:无需建立虚拟链路,协议是不可靠的. A节点以DatagramSocket发送数据包,数据报携带数据,数据报上还有目的目地地址,大部分情况下,数据报可以抵达:但有些情况下,数据报可能会丢失 ...

  7. Java学习系列(十六)Java面向对象之基于TCP协议的网络通信

    TCP/IP的网络分层模型:应用层(HTTP/FTP/SMTP/POPS...),传输层(TCP协议),网络层(IP协议,负责为网络上节点分配唯一标识),物理层+数据链路层). IP地址用于标识网络中 ...

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

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

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

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

最新文章

  1. OTP gen_server
  2. Android多工程(project)开发实例
  3. sas university edition在ubuntu中的使用
  4. openrowset excel 科学计数_txt的数据导入excel中身份证或银行卡显示成科学计数如何解决...
  5. oracle u01目录 100,文件目录空间利用率达到100%而导致数据库异常挂起的故障处理过...
  6. IOS Animation-KeyPath值
  7. Python使用C++动态库的方法
  8. Sass 基本特性-基础 笔记
  9. 使用Nodejs 批量下载文件, 甘特图 gantt-schedule-timeline-calendar 免费
  10. 图解TCPIP---第一章
  11. iOS UDP和TCP测试工具sokit
  12. tftp 查看服务器文件夹,TFTP服务器的配置
  13. 苹果绕过ID_亲测:苹果手机绕过ID,到底能不能用?结果不太理想
  14. 计算机win7系统还原,win7还原系统——win7系统还原出厂设置
  15. Ubuntu安装翻译软件(goldendcit)
  16. 华为交换机eth口作用_华为5700交换机eth接口做什么用的?怎么使用它?
  17. Python的10086查询系统模拟
  18. 产业研发用房是什么意思_和谷山汇城是什么项目哦?和谷山汇城的产业研发用房值得买吗?...
  19. uniapp自定义H5页面浏览器标签栏小图标
  20. 2023年最新Java高级面试题笔记(面试题+答案)

热门文章

  1. transition transform
  2. Number.isInteger在IE中报错的解决方法
  3. 解决Intellij IDEA 通过archetype创建Maven项目缓慢的问题
  4. 数据库:mongodb与关系型数据库相比的优缺点zz (转)
  5. C++ 虚函数表解析(转)
  6. 操作系统双语阅读 - Schedulers调度器2
  7. macOS U盘烧录Linux iso镜像
  8. B00014 C++实现的AC自动机
  9. linux学习之lvm2逻辑卷管理
  10. 将本地数据库备份到远程服务器