一、   TCP/IP协议(Transmission Control Protocol/Internet Protocol)传输控制协议/Internet协议,是通信领域的基础、核心协议,

其他的协议都是由TCP/IP派生出来的子协议,如:HTTP(Haper Text Transfer Protocol)超文本传输协议、FTP(File Transfer Protocol)文件传输协议。

 

二、   Java语言的网络开发:

  在Java中通过Socket(套接字,是通信的通道)来实现TCP/IP协议的规范,实现网络通信,具体会涉及到两个类和两个方法:

  1.   ServerSocket实现类:在创建对象时设置服务器在哪个端口监听客服端的连接。
  2.   Socket实现类:在创建对象时设置要去连接哪个“主机”的哪个“端口”与服务器建立连接。

    getInputStream()方法:用于获取对方发送的数据的通道。

    getOutputStream()方法:用于向对方发送数据的通道。

 

三、   Socket网络编程的开发流程:

  1.   服务器端的开发流程

    1)  创建ServerSocket的对象,同时指定在哪个端口监听客户端的连接。

    2)  再通过ServerSocket的对象调用accept()方法获取Socket,通过Socket通道可以获取对方发送的信息,同时也可以向对方发送消息。

    3)  通过socket调用getInputStream()方法或getOutputStream()方法建立“输入”、“输出”的通道实现获取或发送消息,

      为了提高效率,可以将发送过程中使用的字节流转化为字符流,且可以将字符流放置到带缓冲的字符流中。

    4)  在循环中反复向“文本域jTextArea”追加对方发送过来的消息。

    5)  针对“发送按钮 jButton”调用addActionListener方法进行监听他是否被点击,点击时要完成:1、向对方发送消息。2、将消息追加到文本域

    6)  关闭打开的资源:ServerSocket、Socket、InputStreamReader、BufferedInputStream、PrintWriter

 

package com.oop.ch15;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket; import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField; /**
* 聊天程序:服务器端
*/
public class QQServer { static JTextArea jTextArea = null; // 文本域: 显示信息的地方
static JScrollPane jScrollPane = null; // 屏幕滚动条: 当文本域内容较多时显示滚动条
static JTextField jTextField = null; // 文本框:用户输入信息的地方
static JButton jButton = null; // 按扭: 发送按扭
static JPanel jPanel = null; // 面板: 放置元素的场所 static PrintWriter printWriter = null; // 发送信息:将信息发送到对方的对象
static String toStr = null; // 发送到客户端的信息,用于判断是否发送结束的标志
static String getStr = null; // 保存对方发送过来的消息 public static void main(String[] args) { /** 一、显示“聊天对话框”界面 开始 */
JFrame jFrame = new JFrame("聊天对话框(服务器端)");
// 创建一个面板
jPanel = new JPanel(); // 创建一个文本域, 并将其放入滚动窗格组件(JScrollPane)中实现滚动条的效果。
jTextArea = new JTextArea();
jScrollPane = new JScrollPane(jTextArea); // 创建一个文本框
jTextField = new JTextField(20);
// 创建一个发送按扭
jButton = new JButton("发送"); /* 4. 对发送按扭进行监听 */
/*
* 5) 针对“发送按钮 jButton”调用addActionListener()方法进行监听他是否被点击,
* 点击时要完成:a、向对方发送消息。b、将消息追加到文本域
*/
jButton.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
//获取输入框中的消息,并将消息前后空格去掉
toStr = jTextField.getText().trim();
//判断如果监听到的事件是jButton就执行下面的操作
if (e.getSource() == jButton) {
//如果不为空
if (toStr != null && toStr != "") {
//把输入框中的消息给printWriter,然后终止该行。
printWriter.println(toStr);
//在文本域中追加消息
jTextArea.append("服务器端:" + toStr + "\r\n\n");
//将输入框置空
jTextField.setText("");
//如果自己发送的消息或者收到的消息是88就结束聊天
if ("88".equals(toStr) || "88".equals(getStr)) {
System.out.println("结束聊天");
return;
}
}
}
}
}); // 文本框、发送按扭放置到面板中JPanel
jPanel.add(jTextField);
jPanel.add(jButton); // 将带滚动的文本域、面板放置到窗体中
jFrame.add(jScrollPane, "Center");
jFrame.add(jPanel, BorderLayout.SOUTH); // 将QQ图片放置在窗体的左上角。
jFrame.setIconImage((new ImageIcon("G:/Javatest/qq.jpg")).getImage());
jFrame.setBounds(100, 100, 400, 300); // 设置窗体初始位置、大小
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭窗体时退出程序
jFrame.setVisible(true); // 将窗体设置为可见的
/** 一、显示“聊天对话框”界面 结束 */ /** 二、socket网络编程 开始 */
//将需要用到的资源定义在try外面,方便后面关闭这些资源
ServerSocket serverSocket = null;
Socket socket = null;
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null; try {
// 1) 创建ServerSocket的对象,同时指定在10000端口监听客户端的连接。
serverSocket = new ServerSocket(10000); /*
* 2) 再通过ServerSocket的对象调用accept()方法获取Socket,
* 通过Socket通道可以获取对方发送的信息,同时也可以向对方发送消息。
*/
socket = serverSocket.accept(); /*
* 3) 通过socket调用getInputStream()方法或getOutputStream()方法 ,
* 建立“输入”、“输出”的通道实现获取或发送消息,
* 为了提高效率,可以将发送过程中使用的字节流转化为字符流, 且可以将字符流放置到带缓冲的字符流中。
*/ inputStreamReader = new InputStreamReader(socket.getInputStream()); // 将传入的字节流转化为字符流
bufferedReader = new BufferedReader(inputStreamReader); // 将字符流放置到缓冲中
//向文本输出流打印对象的格式化表示形式。
printWriter = new PrintWriter(socket.getOutputStream(), true); // true表示立即发送 /* 4) 在循环中反复向“文本域jTextArea”追加对方发送过来的消息。 */
while (true) {
//将从缓冲流中读取到的数据赋给getStr
getStr = bufferedReader.readLine();
//在文本域中追加
jTextArea.append("客户端:" + getStr + "\r\n\n");
//判断是否结束聊天
if ("88".equals(getStr) || "88".equals(toStr)) {
System.out.println("结束聊天");
break;
}
} } catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
/*
* 6) 关闭打开的资源:ServerSocket、Socket、InputStreamReader、
* BufferedInputStream、PrintWriter
*/
try {
if (printWriter != null) {
printWriter.close();
}
if (bufferedReader != null) {
bufferedReader.close();
}
if (inputStreamReader != null) {
inputStreamReader.close();
}
if (socket != null) {
socket.close();
}
if (serverSocket != null) {
serverSocket.close();
} } catch (IOException e) {
e.printStackTrace();
}
} /** 二、socket网络编程 结束 */ } }
  1.   客户端的开发流程

    1)  创建Socket的对象,new Socket(),指定客户端要连接哪台服务器的哪个端口,通过Socket通道可以获取对方发送的信息,同时也可以向对方发送消息。

    2)  通过socket调用getInputStream()方法或getOutputStream()方法建立“输入”、“输出”的通道实现获取或发送消息,

      为了提高效率,可以将发送过程中使用的字节流转化为字符流,且可以将字符流放置到带缓冲的字符流中。

    3)  在循环中反复向“文本域jTextArea”追加对方发送过来的消息。

    4)  针对“发送按钮 jButton”调用addActionListener方法进行监听他是否被点击,点击时要完成:a、向对方发送消息。B、将消息追加到文本域。

    5)  关闭打开的资源:ServerSocket、Socket、InputStreamReader、BufferedInputStream、PrintWriter

package com.oop.ch15;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket; import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField; /**
* 聊天程序:客户端
*/
public class QQClient { static JTextArea jTextArea = null; // 文本域: 显示信息的地方
static JScrollPane jScrollPane = null; // 屏幕滚动条: 当文本域内容较多时显示滚动条
static JTextField jTextField = null; // 文本框:用户输入信息的地方
static JButton jButton = null; // 按扭: 发送按扭
static JPanel jPanel = null; // 面板: 放置元素的场所 static PrintWriter printWriter = null; // 发送信息:将信息发送到对方的对象
static String toStr = null; // 发送到客户端的信息,用于判断是否发送结束的标志
static String getStr = null; // 保存对方发送过来的消息 public static void main(String[] args) { /** 一、显示“聊天对话框”界面 开始 */
JFrame jFrame = new JFrame("聊天对话框(客户端)");
// 创建一个面板
jPanel = new JPanel(); // 创建一个文本域, 并将其放入滚动窗格组件(JScrollPane)中实现滚动条的效果。
jTextArea = new JTextArea();
jScrollPane = new JScrollPane(jTextArea); // 创建一个文本框
jTextField = new JTextField(20);
// 创建一个发送按扭
jButton = new JButton("发送");
/* 4. 对发送按扭进行监听 */
/*
* 4) 针对“发送按钮 jButton”调用addActionListener()方法进行监听他是否被点击,
* 点击时要完成:a、向对方发送消息。B、将消息追加到文本域
*/
jButton.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
//获取输入框中的消息,并将消息前后空格去掉
toStr = jTextField.getText().trim();
//判断如果监听到的事件是jButton就执行下面的操作
if (jButton == e.getSource()) {
if (toStr != null && toStr != "") {
printWriter.println(toStr);
jTextArea.append("客户端:" + toStr + "\r\n\n");
jTextField.setText("");
if ("88".equals(toStr) || "88".equals(getStr)) {
System.out.println("结束聊天");
return;
}
}
} }
}); // 文本框、发送按扭放置到面板中JPanel
jPanel.add(jTextField);
jPanel.add(jButton); // 将带滚动的文本域、面板放置到窗体中
jFrame.add(jScrollPane, "Center");
jFrame.add(jPanel, BorderLayout.SOUTH); // 将QQ图片放置在窗体的左上角。
jFrame.setIconImage((new ImageIcon("G:/Javatest/qq.jpg")).getImage());
jFrame.setBounds(500, 100, 400, 300); // 设置窗体初始位置、大小
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭窗体时退出程序
jFrame.setVisible(true); // 将窗体设置为可见的
/** 一、显示“聊天对话框”界面 结束 */ /** 二、socket网络编程 开始 */
//将需要用到的资源定义在try外面,方便后面关闭这些资源
Socket socket = null;
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null; try {
/*
* 1) 创建Socket的对象,new Socket(),指定客户端要连接哪台服务器的哪个端口,
* 通过Socket通道可以获取对方发送的信息,同时也可以向对方发送消息。
*/
//指定客户端要连接的服务器和服务器的端口
socket = new Socket("localhost", 10000); /*
* 2) 通过socket调用getInputStream()方法或getOutputStream()方法 ,
* 建立“输入”、“输出”的通道实现获取或发送消息,
* 为了提高效率,可以将发送过程中使用的字节流转化为字符流, 且可以将字符流放置到带缓冲的字符流中。
*/
//接收:对接收到的数据进行操作
inputStreamReader = new InputStreamReader(socket.getInputStream()); // 将传入的字节流转化为字符流
bufferedReader = new BufferedReader(inputStreamReader); // 将字符流放置到缓冲中
//发送
printWriter = new PrintWriter(socket.getOutputStream(), true); /* 3) 在循环中反复向“文本域jTextArea”追加对方发送过来的消息。 */
while (true) {
getStr = bufferedReader.readLine();
jTextArea.append("服务器端:\n" + getStr + "\r\n\n");
if ("88".equals(getStr) || "88".equals(toStr)) {
System.out.println("结束聊天");
break;
}
} } catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
/*
* 5) 关闭打开的资源:ServerSocket、Socket、InputStreamReader、
* BufferedInputStream、PrintWriter
*/
try {
if (printWriter != null) {
printWriter.close();
}
if (bufferedReader != null) {
bufferedReader.close();
}
if (inputStreamReader != null) {
inputStreamReader.close();
}
if (socket != null) {
socket.close();
} } catch (IOException e) {
e.printStackTrace();
}
} /** 二、socket网络编程 结束 */ } }

java oop第15章_Socket网络编程的更多相关文章

  1. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  2. 20165230 《Java程序设计》实验五《网络编程与安全》实验报告

    20165230 <Java程序设计>实验五<网络编程与安全>实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:田坤烨 学号:20165230 成绩: ...

  3. 20155236 《Java程序设计》实验五(网络编程与安全)实验报告

    20155236 <Java程序设计>实验五(网络编程与安全)实验报告 一.实验内容及步骤 任务一: 编写MyBC.java实现中缀表达式转后缀表达式的功能 编写MyDC.java实现从上 ...

  4. 20155205《Java程序设计》实验五(网络编程与安全)实验报告

    20155205 <Java程序设计>实验五(网络编程与安全)实验报告 一.实验内容及步骤 (一) 两人一组结对编程 参考http://www.cnblogs.com/rocedu/p/6 ...

  5. 20145207《Java程序设计》实验五(网络编程与安全)实验报告

    <Java 程序设计>实验五(网络编程与安全)实验报告 目录 改变 网络编程与安全实验要求 实验成果 课后思考 改变 修改了之前仅仅是贴了图片,连代码都没粘的状态.不过这篇博客我只能做到写 ...

  6. #《JAVA程序设计》 20155214 实验五 网络编程与安全

    <JAVA程序设计> 20155214 实验五 网络编程与安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验要求 要求一 结对实现中缀表达式转后缀 ...

  7. 20155218 《Java程序设计》实验五(网络编程与安全)实验报告

    20155218 <Java程序设计>实验五(网络编程与安全)实验报告 一.实验内容及步骤 (一) 编写MyBC.java实现中缀表达式转后缀表达式的功能 编写MyDC.java实现从上面 ...

  8. 20155304 2016-2017-2 《Java程序设计》实验五(网络编程与安全)实验报告

    20155304 2016-2017-2 <Java程序设计>实验五(网络编程与安全)实验报告 实验内容及步骤: 一.两人一组结对编程: 参考http://www.cnblogs.com/ ...

  9. 20155310《Java程序设计》实验五(网络编程与安全)实验报告

    20155310<Java程序设计>实验五(网络编程与安全)实验报告 一.实验内容及步骤 •任务一: 编写MyBC.java实现中缀表达式转后缀表达式的功能 编写MyDC.java实现从上 ...

随机推荐

  1. fdisk分区实例

    查看磁盘分区详情 直接使用fdisk -l 或者使用fdisk /dev/sda,再使用p命令来查看 Command (m for help): p Disk /dev/sda: 32.2 GB, 3 ...

  2. linux kill命令

    代码 elif [ "$SIGNAL" = 'reload' ]; then kill -USR1 $PID 总结:kill -9 pid 等同于kill -USR9 pid 等同 ...

  3. Springboot的Mybatis逆向工程

    1.pom.xml添加mybatis和逆向插件依赖: <dependency> <groupId>org.mybatis.spring.boot</groupId> ...

  4. Android组件内核之组件间通信方案(四)上篇

    阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680本篇文章将先从以下三个内容来介绍通信方案: [Activity与Fragm ...

  5. Vue.js 入门:从零开始做一个极简 To-Do 应用

    Vue.js 入门:从零开始做一个极简 To-Do 应用 写作时间:2019-12-10版本信息:Vue.js 2.6.10官网文档:https://cn.vuejs.org/ 前言  学习 Vue ...

  6. 【记录】linux 常用命令梳理

    命令梳理 下载文件 [wget 是一个十分常用命令行下载工具,多数Linux发行版本都默认包含这个工具] wget -c [zip路径等] #断点续传,如果下载中断,那么连接恢复时会从上次断点开始下载 ...

  7. 2018-2-13-win10-UWP-等级控件

    title author date CreateTime categories win10 UWP 等级控件 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17: ...

  8. (转)OpenGL学习——立方体贴图

    转自:https://learnopengl-cn.readthedocs.io/zh/latest/04%20Advanced%20OpenGL/06%20Cubemaps/ 我们之前一直使用的是2 ...

  9. Windows 下安装 nvm 管理 nodejs 版本

    摘自https://segmentfault.com/a/1190000007612011 1. 下载安装与使用 Github: Download nvm-windows --- nvm-setup. ...

  10. Codeforces 1150D DP

    题意:给你一个长度为n的字符串,有q次询问,每次询问会给字符串x的末尾添加一个字符y,或者删除字符串x末尾的字符,询问过后,要判断长度为n的字符串中是否有3个不重合的子序列,是这3个字符串. 思路:设 ...