了解计算机网络的概述,掌握Sokcet类编程,ServerSocket类,Socket类的构造方法和常用方法
计算机网络计算机们组成的网络,同一个网络中,计算机可以直接通信,因为计算机都需遵循同一种网络协议。
互联网是网络的网络(internet),即把很多计算机网络连接起来,形成一个全球统一的互联网。
某个计算机网络,可能使用网络协议ABC,而另一个可能使用网络协议XYZ。如通讯协议不统一,则无法连接形成互联网。统一使用TCP/IP协议。
TCP/IP协议:
泛指互联网协议,其中最重要的两个协议是TCP协议和IP协议。只有使用TCP/IP协议的计算机才能够联入互联网,使用其他网络协议(例如NetBIOS、AppleTalk协议等)是无法联入互联网的。
在互联网中,一个IP地址用于唯一标识一个网络接口(Network Interface)。一台联入互联网的计算机至少有一个IP地址,或多个IP地址。
IP地址分为IPv4和IPv6两种。
IPv4采用32位地址,类似101.202.99.12,IPv4地址总共有232个(大约42亿),IPv4的地址目前已耗尽。
而IPv6采用128位地址,类似2001:0DA8:100A:0000:0000:1020:F2F3:1428,IPv6地址则总共有2128个(大约340万亿亿亿亿),而IPv6的地址是根本用不完的。
有一个特殊的IP地址,称之为本机地址,它总是:127.0.0.1(localhost)。
直接记忆IP地址困难,通常使用域名访问某个特定的服务。域名解析服务器DNS负责把域名翻译成对应的IP,客户端再根据IP地址访问服务器。
在cmd中用nslookup可以查看域名对应的IP地址
有一个特殊的本机域名localhost
TCP协议:
是应用最广泛的协议,许多高级协议都是建立在TCP协议之上的,例如HTTP、SMTP等。
UDP协议(User Datagram Protocol):
是一种数据报文协议,它是无连接协议,不保证可靠传输。
在开发网络应用程序的时候,我们又会遇到Socket这个概念。
Socket、TCP和部分IP的功能都是由操作系统提供的,不同的编程语言只是提供了对操作系统调用的简单的封装。
Socket就是由IP地址和端口号(范围是0~65535)组成,可以把Socket简单理解为IP地址加端口号。
端口号由操作系统分配,特权端口(小于1024)需管理员权限,普通端口(大于1024)任意用户的应用程序打开。
比如mysql端口: 127.0.0.1:3306
Java提供的网络类库(java.net),可以实现无缝的网络连接
使用Socket进行网络编程时,本质上就是两个进程之间的网络通信。
一个进程服务器端,它会主动监听某个指定的端口。一个客户端,它必须主动连接服务器的IP地址和指定端口,如果连接成功,服务器端和客户端就成功地建立了一个TCP连接,双方后续就可以随时发送和接收数据。
构造方法:
//创建绑定到指定端口的服务器套接字。 ServerSocket(int port)
常用方法:
Socket accept() throws IOException //等待客户端的连接请求,返回与该客户端进行通信用的Socket对象 void setSoTimeout(int timeout) throws SocketException //设置accept()方法等待连接的时间为timeout毫秒。若时间已到,还没有客户端连接,则抛出InterruptedIOException异常,accept()方法不再阻塞,该倾听Socket可继续使用。若timeout值为0,则表示accept()永远等待。该方法必须在倾听Socket创建后,在accept()之前调用才有效。 void close()throws IOException //关闭监听Socket InetAddress getInetAddress() //返回此服务器套接字的本地地址 int getLocalPort() //返回此套接字在其上监听的端口号 SocketAddress getLocalSocketAddress() //返回此套接字绑定的端点的地址
构造方法:
//创建流套接字并将其连接到指定IP地址的指定端口号。 Socket(InetAddress address, int port)
常用方法:
InetAddress getLocalAddress() //返回对方Socket中的IP的InetAddress对象 int getLocalPort() //返回本地Socket中的端口号 InetAddress getInetAddress() //返回对方Socket中IP地址 int getPort() //返回对方Socket中的端口号 void close() throws IOException //关闭Socket,释放资源 InputStream getInputStream() throws IOException //获取与Socket相关联的字节输入流,用于从Socket中读数据。 OutputStream getOutputStream() throws IOException //获取与Socket相关联的字节输出流,用于向Socket中写数据。
例:
public class FuWuDuan { public static void main(String[] args) { ServerSocket ss = null; Socket s = null; InputStream is = null; OutputStream os = null; Scanner sc = null; try { ss = new ServerSocket(1314); sc= new Scanner(System.in); while (true) { //创建监听,接受客服端请求 s = ss.accept(); is = s.getInputStream(); //读写客户端的请求 byte b[] = new byte[1024]; is.read(b); System.out.println("服务端收到:"+new String(b)); //输出请求,发生客户端 os = s.getOutputStream(); System.out.println("服务端请发出:"); String str = sc.next(); byte b1[] = str.getBytes(); os.write(b1); os.flush(); } } catch (IOException e) { e.printStackTrace(); } finally { //关流 } } }
public static void main(String[] args) { Socket s = null; OutputStream os = null; Scanner sc = null; InputStream is = null; + try { //创建连接,连接服务端 sc= new Scanner(System.in); while (true) { s = new Socket("192.168.2.88", 1314); //输出请求,发生服务端 os = s.getOutputStream(); System.out.println("客服端请发出:"); String str = sc.next(); byte b[] = str.getBytes(); os.write(b); os.flush(); is = s.getInputStream(); //读写服务端的请求 byte b1[] = new byte[1024]; is.read(b); System.out.println("客服端收到:"+new String(b)); } } catch (IOException e) { e.printStackTrace(); } finally { //关流 } } }