第19章 网络通信----TCP程序设计基础
TCP网络程序设计是指利用Socket类编写通信程序。利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序,两者的功能和编写方法大不一样。
1、InetAddress类
java.net包中InetAddress类是与IP地址相关的类,利用该类可以获取IP地址、主机地址等信息。
InetAddress类的方法会抛出UnknownHostException异常,所以必须进行异常处理。这个异常在主机不存在或网络连接错误时发生。
例如:使用InetAddress类的getHostName()和getHostAddress()方法获得本地主机的主机名、本机IP地址。
import java.net.*; public class Address { // 创建类
public static void main(String[] args) {
InetAddress ip; // 创建InetAddress对象
try { // try语句块捕捉可能出现的异常
ip = InetAddress.getLocalHost(); // 实例化对象
String localname = ip.getHostName(); // 获取本机名
String localip = ip.getHostAddress(); // 获取本IP地址
System.out.println("本机名:" + localname);// 将本机名输出
System.out.println("本机IP地址:" + localip); // 将本机IP输出
} catch (UnknownHostException e) {
e.printStackTrace(); // 输出异常信息
}
}
}
2、ServerSocket类
3、TCP网络程序
在网络编程中如果只要求客户机向服务器发送消息,不要求服务器向客户机发送信息,称为单向通信。客户机套接字和服务器套接字连接成功后,客户机通过输出流发送数据,服务器则通过输入流接收数据。
(1)首先建立一个TCP服务器程序,在getserver()方法中建立服务器套接字,调用getClientMessage()方法获取客户端信息。
运行服务器端程序,将输出提示信息,等待客户呼机。
import java.io.*;
import java.net.*; public class MyTcp { // 创建类MyTcp
private BufferedReader reader; // 创建BufferedReader对象
private ServerSocket server; // 创建ServerSocket对象
private Socket socket; // 创建Socket对象socket void getserver() {
try {
server = new ServerSocket(8998); // 实例化Socket对象
System.out.println("服务器套接字已经创建成功"); // 输出信息
while (true) { // 如果套接字是连接状态
System.out.println("等待客户机的连接"); // 输出信息
socket = server.accept(); // 实例化Socket对象
reader = new BufferedReader(new InputStreamReader(socket
.getInputStream())); // 实例化BufferedReader对象
getClientMessage(); // 调用getClientMessage()方法
}
} catch (Exception e) {
e.printStackTrace(); // 输出异常信息
}
} private void getClientMessage() {
try {
while (true) { // 如果套接字是连接状态
if (reader.ready()) {
// 获得客户端信息
System.out.println("客户机:" + reader.readLine());
}
}
} catch (Exception e) {
e.printStackTrace(); // 输出异常信息
}
try {
if (reader != null) {
reader.close(); // 关闭流
}
if (socket != null) {
socket.close(); // 关闭套接字
}
} catch (IOException e) {
e.printStackTrace();
}
} public static void main(String[] args) { // 主方法
MyTcp tcp = new MyTcp(); // 创建本类对象
tcp.getserver(); // 调用方法
}
}
(2)然后建立一个客户端程序,实现将用户在文本框中输入的信息发送至服务器端,并将文本框中的输入的信息显示在客户端的文本域中。
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*; import javax.swing.*;
import javax.swing.border.*; public class MyClien extends JFrame { // 创建类继承JFrame类
/**
*
*/
private static final long serialVersionUID = 1L;
private PrintWriter writer; // 声明PrintWriter类对象
Socket socket; // 声明Socket对象
private JTextArea ta = new JTextArea(); // 创建JtextArea对象
private JTextField tf = new JTextField(); // 创建JtextField对象
Container cc; // 声明Container对象 public MyClien(String title) { // 构造方法
super(title); // 调用父类的构造方法
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
cc = this.getContentPane(); // 实例化对象 final JScrollPane scrollPane = new JScrollPane();
scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));
getContentPane().add(scrollPane, BorderLayout.CENTER);
scrollPane.setViewportView(ta);
cc.add(tf, "South"); // 将文本框放在窗体的下部
tf.addActionListener(new ActionListener() {
// 绑定事件
public void actionPerformed(ActionEvent e) {
// 将文本框中信息写入流
writer.println(tf.getText());
// 将文本框中信息显示在文本域中
ta.append(tf.getText() + '\n');
ta.setSelectionEnd(ta.getText().length());
tf.setText(""); // 将文本框清空
}
});
} private void connect() { // 连接套接字方法
ta.append("尝试连接\n"); // 文本域中提示信息
try { // 捕捉异常
socket = new Socket("127.0.0.1", 8998); // 实例化Socket对象
writer = new PrintWriter(socket.getOutputStream(), true);
ta.append("完成连接\n"); // 文本域中提示信息
} catch (Exception e) {
e.printStackTrace(); // 输出异常信息
}
} public static void main(String[] args) { // 主方法
MyClien clien = new MyClien("向服务器送数据"); // 创建本例对象
clien.setSize(200, 200); // 设置窗体大小
clien.setVisible(true); // 将窗体显示
clien.connect(); // 调用连接方法
}
}
第19章 网络通信----TCP程序设计基础的更多相关文章
- 第19章 网络通信----UDP程序设计基础
用户数据报协议(UDP)是网络信息传输的另一种形式. 基于UDP通信的基本模式如下: (1)将数据打包(称为数据包),然后将数据包发往目的地. 发送数据包: 使用DatagramSocket()创建一 ...
- TCP程序设计基础
1.端口与套接字 IP地址--->端口--->套接字(Socket)--->应用程序 2.TCP服务器端和客户端通信 1)服务器创建一个ServerSocket,调用accept() ...
- 《TCP/IP详解卷1:协议》第19章 TCP的交互数据流-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- [Real World Haskell翻译]第27章 网络通信和系统日志 Sockets and Syslog
第27章 网络通信和系统日志 Sockets and Syslog 基础网络 在本书的前面几章,我们讨论了运转在网络上的服务.其中的两个例子是客户端/服务器架构的数据库和Web服务.当需要制定一个新的 ...
- 第一章 了解TCP/IP协议族
第一章 了解TCP/IP协议族 1.1 TCP/IP协议族体系结构以及主要协议 IP和TCP协议对编写程序具有最直接的影响,后面的章节会详细的讲到. TCP/IP的体系结构有应用层,传输层,网络层,数 ...
- Laxcus大数据管理系统2.0(8)- 第六章 网络通信
第六章 网络通信 Laxcus大数据管理系统网络建立在TCP/IP网络之上,从2.0版本开始,同时支持IPv4和IPv6两种网络地址.网络通信是Laxcus体系里最基础和重要的一环,为了能够利用有限的 ...
- 【RL-TCPnet网络教程】第19章 RL-TCPnet之BSD Socket服务器
第19章 RL-TCPnet之BSD Socket服务器 本章节为大家讲解RL-TCPnet的BSD Socket,学习本章节前,务必要优先学习第18章的Socket基础知识.有了这些基础知 ...
- Linux就这个范儿 第19章 团结就是力量 LSB是Linux标准化基地(Linux Standards Base)的简称
Linux就这个范儿 第19章 团结就是力量 LSB是Linux标准化基地(Linux Standards Base)的简称 这个图片好可爱,它是LSB组织的图标.你肯定会问:“图标这么设计一定有说 ...
- 【C#4.0图解教程】笔记(第19章~第25章)
第19章 泛型 1.泛型概念 泛型提供了一种更准确地使用有一种以上的类型的代码的方式. 泛型允许我们声明类型参数化的代码,我们可以用不同的类型进行实例化. 泛型不是类型,而是类型的模板. 2.声明 ...
随机推荐
- 让ECSHOP模板支持转smarty时间戳
找到includes/cls_template.php 在大约640行,加入: case 'time': $p = 'date("Y-m-d H:i:s",' . $p . ')' ...
- IOS应用的国际化
IOS应用的国际化,主要分为3个部分: Info.plist 文件的国际化 .xib文件的国际化 .m文件的国际化 下面我就来一一说明. Info.plist 文件的国际化我们使用Xcode 4.5 ...
- JavaScript中以构造函数的方式调用函数
转自:http://www.cnblogs.com/Saints/p/6012188.html 构造器函数(Constructor functions)的定义和任何其它函数一样,我们可以使用函数声明. ...
- python 字典排序,列表排序详细
在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的.因此,为了使统计得到的结果更方便查看需要进行排序.Python中字典的排序分为按“键”排序和按“值”排序. 1.按“值 ...
- ob_get_contents()
ob_start();//buf1 echo 'multiple'; ob_start();//buf2 echo 'bufferswork'; $buf2 = ob_get_contents(); ...
- json格式数据,将数据库中查询的结果转换为json, 然后调用接口的方式返回json(方式一)
调用接口,无非也就是打开链接 读取流 将结果以流的形式输出 将查询结果以json返回,无非就是将查询到的结果转换成jsonObject ================================ ...
- 关于C++中虚函数表存放位置的思考
其实这是我前一段时间思考过的一个问题,是在看<深入探索C++对象模型>这本书的时候我产生的一个疑问,最近在网上又看到类似的帖子,贴出来看看: 我看到了很多有意思的答案,都回答的比较好,下面 ...
- Boost的VS开发环境搭建
1. 下载并解压Boost C++ Libs 下载地址: SourceForge:http://sourceforge.net/projects/boost/files/boost/1.48.0/ B ...
- Snackbar使用及其注意事项(转)
http://blog.csdn.net/jywangkeep_/article/details/46405301 Snackbar使用及其注意事项 引言 Snackbar是Android Suppo ...
- ClickOnce发布注意的一些细节
细节1.应用程序启动前检查更新: 步骤:主工程-右键属性-发布(页面)-按“更新”按钮-勾选“应用程序应该检查更新(T)”-选择“应用程序启动前(F)”,如下图: 细节二:ClickOnce发布时&q ...