第十九章 网络通信

网络通信

本章将从介绍网络协议开始,向读者介绍TCP网络程序和UDP网络程序

网络程序设计基础

局域网与因特网

网络协议

  1. IPv4,4个字节; IPv6,16个字节。
  2. TCP(Transmission Control Protocol)协议适合可靠性要求比较高的场合,HTTP、FTP和Telnet等都需要使用可靠的通信频道
  3. UDP(User Datagram Protocol)无连接,不可靠通信协议。以独立发送数据包的方式进行。

端口和套接字

  1. 所有数据通过端口对内、外送达特定的计算机。
  2. 网络程序设计中的端口(port)是一个假想的连接装置。端口被规定为一个在0~65535之间的整数。HTTP服务一般使用80端口,而FTP服务使用21端口。
  3. 通常0~1023之间的端口数用于一些知名的网络和应用。
  4. 网络程序中的套接字(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类

  1. ServerSocket类用于表示服务器套接字,主要功能是等待来自网络上的“请求”。
  2. 服务器套接字一次可以与一个套接字连接,如果多台客户机同时提出连接请求,服务器套接字会将请求连接的客户机存入列队中,然后从中取出一个套接字,与服务器新建的套接字连接起来。
  3. 队列的默认大小是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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值