网络通信
本章将从介绍网络协议开始,向读者介绍TCP网络程序和UDP网络程序
网络程序设计基础
局域网与因特网
网络协议
- IPv4,4个字节; IPv6,16个字节。
- TCP(Transmission Control Protocol)协议适合可靠性要求比较高的场合,HTTP、FTP和Telnet等都需要使用可靠的通信频道
- UDP(User Datagram Protocol)无连接,不可靠通信协议。以独立发送数据包的方式进行。
端口和套接字
- 所有数据通过端口对内、外送达特定的计算机。
- 网络程序设计中的端口(port)是一个假想的连接装置。端口被规定为一个在0~65535之间的整数。HTTP服务一般使用80端口,而FTP服务使用21端口。
- 通常0~1023之间的端口数用于一些知名的网络和应用。
- 网络程序中的套接字(Socket) 用于将应用程序与端口连接起来。套接字是一个假想的连接装置,就像插插头的设备“插座”用于连接电器与电线一样。

TCP程序设计基础
TCP网络程序设计是指利用Socket类编写通信程序。
InetAddress
Java.net包中的InetAddress类是与IP地址相关的类,利用该类可以获取IP地址、主机地址等信息。
InetAddress类常用方法:
| 方法 | 返回值 | 说明 |
|---|---|---|
| getByName (String host) | InetAddress | 获取与Host想对应的InetAddress对象 |
| getHostAddress() | String | 获取InetAddress对象所包含的IP地址 |
| getHostName() | String | 获取此IP地址的主机名 |
| getLocalHost() | InetAddress | 返回本地主机的InetAddress对象 |
例:
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(); // 输出异常信息
}
}
}
ServeSocket类
- ServerSocket类用于表示服务器套接字,主要功能是等待来自网络上的“请求”。
- 服务器套接字一次可以与一个套接字连接,如果多台客户机同时提出连接请求,服务器套接字会将请求连接的客户机存入列队中,然后从中取出一个套接字,与服务器新建的套接字连接起来。
- 队列的默认大小是50
具体构造方法查看API
常用方法:
| 方法 | 返回值 | 说明 |
|---|---|---|
| accept() | Socket | 等待客户及的连接。若连接,则创建一套接字 |
| isBound() | boolean | 判断ServerSocket的帮顶状态 |
| getInetAddress() | InetAddress | 返回此服务器套接字的本地地址 |
| isClosed() | boolean | |
| close() | void | 关闭服务器套接字 |
| bind(SocketAddress endpoint) | void | 将ServerSocket绑定到特定地址(IP地址和端口号) |
| getInetAddress() | int | 返回服务器套接字等待的端口号 |
当服务器向输出流写入信息时,客户端通过相应的输入流就能读取,反之亦然。
accept()方法会阻塞线程的继续执行,知道接收到客户的呼叫
TCP网络程序
package com.lzw;
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

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



