一、   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. CentOS MySQL 5.7编译安装

    CentOS MySQL 5.7编译安装 MySQL 5.7 GA版本的发布,也就是说从现在开始5.7已经可以在生产环境中使用,有任何问题官方都将立刻修复. MySQL 5.7主要特性: 更好的性能: ...

  2. Neo4j parameter

    Neo4j browser: $ :help param Set a parameter Set a parameter to be sent with queries. The :param nam ...

  3. log4j 和 log4j2 在springboot中的性能对比

    文章链接: https://pengcheng.site/2019/11/17/log4j-he-log4j2-zai-springboot-zhong-de-xing-neng-dui-bi/ 前言 ...

  4. MVC中的自定义标签分页控件,仅供大家学习!!

    public static HtmlString ShowPageNavigate(this HtmlHelper htmlHelper, int currentPage, int pageSize, ...

  5. LeetCode Array Easy 217. Contains Duplicate

    Description Given an array of integers, find if the array contains any duplicates. Your function sho ...

  6. 在MVC4.5.1中使用Ninject

    看完Pro ASP.NET MVC5的前14章之后,终于开始了自己的项目搭建. 打算在实际项目中使用Ninject 但是总是出现各种问题.这里记录一下 在书中使用的Ninject的版本是: Insta ...

  7. Git版本控制及gitlab私有仓库

    Git版本控制系统 版本控制系统简介 版本控制系统是一种记录一个或若干个文件内容变化,以便将来查阅特定版本内容情况的系统 记录文件的所有历史变化 随时恢复到任何一个历史状态 多人协作开发 常见版本管理 ...

  8. 神奇的Android Studio Template(转)

    转自:http://blog.csdn.net/lmj623565791/article/details/51592043 本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台 ...

  9. kubernetes报错

    错误信息:执行yaml文件后,服务在运行,但是提示命令找不到 原因:没有环境,相当于只有一个快捷方式 环境目录为/usr/local/bin 解决办法:将/etc/ansible/bin下的文件都拷贝 ...

  10. linux中的read_link

    readlink是linux系统中一个常用工具,主要用来找出符号链接所指向的位置. readlink 获取当前进程对应proc/self/exe]:shell中  readlink /proc/sel ...