第19章 网络通信----TCP程序设计基础
2015-08-09 15:18
736 查看
TCP网络程序设计是指利用Socket类编写通信程序。利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序,两者的功能和编写方法大不一样。
1、InetAddress类
java.net包中InetAddress类是与IP地址相关的类,利用该类可以获取IP地址、主机地址等信息。
InetAddress类的方法会抛出UnknownHostException异常,所以必须进行异常处理。这个异常在主机不存在或网络连接错误时发生。
例如:使用InetAddress类的getHostName()和getHostAddress()方法获得本地主机的主机名、本机IP地址。
2、ServerSocket类
3、TCP网络程序
在网络编程中如果只要求客户机向服务器发送消息,不要求服务器向客户机发送信息,称为单向通信。客户机套接字和服务器套接字连接成功后,客户机通过输出流发送数据,服务器则通过输入流接收数据。
(1)首先建立一个TCP服务器程序,在getserver()方法中建立服务器套接字,调用getClientMessage()方法获取客户端信息。
运行服务器端程序,将输出提示信息,等待客户呼机。
(2)然后建立一个客户端程序,实现将用户在文本框中输入的信息发送至服务器端,并将文本框中的输入的信息显示在客户端的文本域中。
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(); // 调用连接方法 } }
相关文章推荐
- hdu 4044 2011北京赛区网络赛E 树形dp ****
- hdu5352 MZL's City 网络流,最小费用最大流模板
- 网络总结
- App Transport Security has blocked a cleartext HTTP 解决办法
- 计算机网络-Tcp的四次挥手
- Python爬虫之抓取网络图片
- [Android]Volley在没有网络时读取图片缓存时出现的问题
- 黑马程序员——Java 网络编程
- mysql网络配置都需要修改哪些
- libevent HTTP client 的实现
- 黑马程序员——网络编程4:域名解析 & 网络结构
- httpd及https学习笔记
- 【我的技术我做主】Apache Httpd Web服务器详解
- 黑马程序员——网络编程3:网络通讯组件介绍及演示-下
- 以前写的一个sniffer网络监听程序(作为备忘)
- 精研Servlet,HttpServlet的实现追究
- HTTP学习
- java TCP/IP实现简单的多人聊天功能
- 计算机应用——DOS命令下的网络管理和诊断
- FTP,Telnet,SMTP,DNS,TFTP,WWW,POP采用的是TCP协议还是UDP协议?各自默认的端口号是多少?