JAVA 网络编程基础

一,前言

了解计算机网络的概述,掌握Sokcet类编程,ServerSocket类,Socket类的构造方法和常用方法

二,计算机网咯

1.概述

计算机网络计算机们组成的网络,同一个网络中,计算机可以直接通信,因为计算机都需遵循同一种网络协议。

互联网是网络的网络(internet),即把很多计算机网络连接起来,形成一个全球统一的互联网。

某个计算机网络,可能使用网络协议ABC,而另一个可能使用网络协议XYZ。如通讯协议不统一,则无法连接形成互联网。统一使用TCP/IP协议。

TCP/IP协议:

泛指互联网协议,其中最重要的两个协议是TCP协议和IP协议。只有使用TCP/IP协议的计算机才能够联入互联网,使用其他网络协议(例如NetBIOS、AppleTalk协议等)是无法联入互联网的。

2.IP地址

在互联网中,一个IP地址用于唯一标识一个网络接口(Network Interface)。一台联入互联网的计算机至少有一个IP地址,或多个IP地址。

IP地址分为IPv4和IPv6两种。

  • IPv4

IPv4采用32位地址,类似101.202.99.12,IPv4地址总共有232个(大约42亿),IPv4的地址目前已耗尽。

  • IPv6

而IPv6采用128位地址,类似2001:0DA8:100A:0000:0000:1020:F2F3:1428,IPv6地址则总共有2128个(大约340万亿亿亿亿),而IPv6的地址是根本用不完的。

有一个特殊的IP地址,称之为本机地址,它总是:127.0.0.1(localhost)。

3.域名

直接记忆IP地址困难,通常使用域名访问某个特定的服务。域名解析服务器DNS负责把域名翻译成对应的IP,客户端再根据IP地址访问服务器。

在cmd中用nslookup可以查看域名对应的IP地址

有一个特殊的本机域名localhost

4.常用协议

TCP协议:

是应用最广泛的协议,许多高级协议都是建立在TCP协议之上的,例如HTTP、SMTP等。

UDP协议(User Datagram Protocol):

是一种数据报文协议,它是无连接协议,不保证可靠传输。

三,TCP编程

在开发网络应用程序的时候,我们又会遇到Socket这个概念。

Socket、TCP和部分IP的功能都是由操作系统提供的,不同的编程语言只是提供了对操作系统调用的简单的封装。

Socket就是由IP地址和端口号(范围是0~65535)组成,可以把Socket简单理解为IP地址加端口号。

端口号由操作系统分配,特权端口(小于1024)需管理员权限,普通端口(大于1024)任意用户的应用程序打开。

比如mysql端口: 127.0.0.1:3306

四,Socket编程

Java提供的网络类库(java.net),可以实现无缝的网络连接

使用Socket进行网络编程时,本质上就是两个进程之间的网络通信。

一个进程服务器端,它会主动监听某个指定的端口。一个客户端,它必须主动连接服务器的IP地址和指定端口,如果连接成功,服务器端和客户端就成功地建立了一个TCP连接,双方后续就可以随时发送和接收数据。

1.ServerSocket类

构造方法:

 //创建绑定到指定端口的服务器套接字。
 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()
     //返回此套接字绑定的端点的地址

2.sokect类

构造方法:

 //创建流套接字并将其连接到指定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中写数据。

五,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 {
             //关流
         }
     }
 }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值