欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java简介以及了解java(二七)

程序员文章站 2022-03-03 09:31:35
...

JAVA网络编程
网络基础知识
网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。
计算机网络形式多样,内容繁杂。网络上的计算机要互相通信,必须遵循一定的协议。目前使用最广泛的网络协议
是Internet上所使用的TCP/IP协议。
IP地址:计算机在网络中唯一标识,相对于internet,IP为逻辑地址。
IP地址分类
A类地址
A类地址第1字节为网络地址,其它3个字节为主机地址。另外第1个字节的最高位固定为0。
A类地址范围:1.0.0.1到126.155.255.254。
A类地址中的私有地址和保留地址:
10.0.0.0到10.255.255.255是私有地址(所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址)。
127.0.0.0到127.255.255.255是保留地址,用做循环测试用的。
B类地址
B类地址第1字节和第2字节为网络地址,其它2个字节为主机地址。另外第1个字节的前两位固定为10。
B类地址范围:128.0.0.1到191.255.255.254。
B类地址的私有地址和保留地址
172.16.0.0到172.31.255.255是私有地址
169.254.0.0到169.254.255.255是保留地址。如果你的IP地址是自动获取IP地址,而你在网络上又没有找到可用的DHCP服务
器,这时你将会从169.254.0.0到169.254.255.255中临得获得一个IP地址。
C类地址
C类地址第1字节、第2字节和第3个字节为网络地址,第4个个字节为主机地址。另外第1个字节的前三位固定为110。
C类地址范围:192.0.0.1到223.255.255.254。
C类地址中的私有地址:
192.168.0.0到192.168.255.255是私有地址。
D类地址
D类地址不分网络地址和主机地址,它的第1个字节的前四位固定为1110。
D类地址范围:224.0.0.1到239.255.255.254
Mac地址:每个网卡专用地址,也是唯一的。
端口(port):应用程序(进程)的标识(网络通信程序)OS中可以有65536(2^16)个端口,进程通过端口交换数据。连线
的时候需要输入IP也需要输入端口信息。
计算机通信实际上的主机之间的进程通信,进程的通信就需要在端口进行联系。
192.168.0.23:21
协议:为了进行网络中的数据交换(通信)而建立的规则、标准或约定,协议是为了保证通信的安全。
不同层的协议是完全不同的。
网络层:寻址、路由(指如何到达地址的过程)
传输层:端口连接
TCP模型:应用层/传输层/网络层/网络接口
层与层之间是单向依赖关系,上层依赖于下层,下层不依赖于上层,层与层之间的连接是虚连接。对等层之间建立协议。
端口是一种抽象的软件结构,与协议相关:TCP23端口和UDT23端口为两个不同的概念。
端口应该用1024以上的端口,以下的端口都已经设定功能。
TCP/IP模型
Application
(FTP,HTTP,TELNET,POP3,SMPT)
Transport
(TCP,UDP)
Network
(IP,ICMP,ARP,RARP)
Link
(Device driver,….)
注:
IP:寻址和路由
ARP(Address Resolution Protocol)地址解析协议:将IP地址转换成Mac地址
RARP(Reflect Address Resolution Protocol)反相地址解析协议:与上相反
ICMP(Internet Control Message Protocol)检测链路连接状况。利用此协议的工具:ping , traceroute

TCP Socket
TCP是Tranfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序
的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一
个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们
就可以进行双向数据传输,双方都可以进行发送或接收操作。
1) 服务器分配一个端口号,服务器使用accept()方法等待客户端的信号,信号一到打开socket连接,从socket中取
得OutputStream和InputStream。
2) 客户端提供主机地址和端口号使用socket端口建立连接,得到OutputStream和InputStream。
TCP/IP的传输层协议
建立TCP服务器端
一般,我们把服务器端写成是分发Socket的,也就是总是在运行,
创建一个TCP服务器端程序的步骤:
1). 创建一个ServerSocket
2). 从ServerSocket接受客户连接请求
3). 创建一个服务线程处理新的连接
4). 在服务线程中,从socket中获得I/O流
5). 对I/O流进行读写操作,完成与客户的交互
6). 关闭I/O流
7). 关闭Socket
ServerSocket server = new ServerSocket(post)
Socket connection = server.accept();
ObjectInputStream put=new ObjectInputStream(connection.getInputStream());
ObjectOutputStreamo put=newObjectOutputStream(connection.getOutputStream());
处理输入和输出流;
关闭流和socket。
典型的服务器端。

public class Server1 {
public static void main(String[] args) throws Exception {
ServerSocket ss=new ServerSocket(9000);
while(true){
Socket s=ss.accept();//获得一个Socket对象。
Thread t=new Thread1(s);//分发Socket。
t.start();
}
}
}
class Thread1 extends Thread{
Socket s;
public Thread1(Socket s){
this.s=s;
}
public void run(){
try {
OutputStream o=s.getOutputStream();
PrintWriter out=new PrintWriter(o);
out.println("Hello Client");
out.flush();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

 
建立TCP客户端
创建一个TCP客户端程序的步骤:
1).创建Socket
2). 获得I/O流
3). 对I/O流进行读写操作
4). 关闭I/O流
5). 关闭Socket
Socket connection = new Socket(127.0.0.1, 7777);
ObjectInputStream input=new ObjectInputStream(connection.getInputStream());
ObjectOutputStream utput=new ObjectOutputStream(connection.getOutputStream());
处理输入和输出流;
关闭流和socket。
例:
服务器端:

import java.net.*;
import java.io.*;
public class Server1 {
public static void main(String[] args) throws Exception {
ServerSocket ss=new ServerSocket(9000);
while(true){
Socket s=ss.accept();
Thread t=new Thread1(s); //为每个线程分配的Socket
t.start();
}
}
}
class Thread1 extends Thread{
Socket s;
public Thread1(Socket s){
this.s=s;
}
public void run(){
try {
OutputStream o=s.getOutputStream();
PrintWriter out=new PrintWriter(o);
out.println("Hello Client");
out.flush();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

 

客户端:

import java.net.*;
import java.io.*;
public class Client1 {
public static void main(String[] args) throws Exception{
Socket s=new Socket("127.0.0.1",9000);
InputStream i=s.getInputStream();
InputStreamReader ir=new InputStreamReader(i);
BufferedReader in=new BufferedReader(ir);
String str=in.readLine();
System.out.println(str);
s.close();
}
}