Java TCP/IP

来源:互联网 发布:删除语句sql 编辑:程序博客网 时间:2024/06/18 13:20

TCP/IP协议是目前世界上应用最为广泛的协议。

是以TCP和IP为基础的不同层次上多个协议的集合。

也称:TCP/IP协议族 或 TCP/IP协议栈


TCP:Transmission  Control   Protocol    传输控制协议

IP : Internet  Protocol互联网协议


TCP/IP分为5层


应用层 HTTP超文本传输协议  FTP文件传输协议   SMTP简单邮件传输协议   Telnet远程登录服务

传输层

网络层 IP在网络层

数据链路层

物理层 例如网线,网卡等



IP地址:

为实现网络中不同计算机之间的通信,每台机器都必须有一个唯一的标识----IP地址

IP地址格式:数字型,如:192.168.0.1

IPV4:IP传输协议第四个版本,长度为32位的2进制。


端口:

1:用于区分不同应用程序

2:端口号范围为0~65535,其中0~1023为系统所保留

3:IP地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UPD的基础

4:常用的端口号http:80    ftp:21   telnet:23


Java中的网络支持

针对网络通信的不同层次,Java提供的网络功能有四大类:

1  InetAddress:用于标识网络上的硬件资源。也就是IP地址的相关信息

2  URL:统一资源定位符  通过URL可以直接读取或写入网络上的数据。

3  Sockets:使用TCP协议实现网络通信的Socket相关的类。

4  Datagram:使用UDP协议,将数据保存在数据报中,通过网络进行通信。



Java中InetAddress类

用于标识网络上的硬件资源。也就是IP地址的相关信息


实例化的方法

InetAddress   address=InetAddress. getLocalHost();//通过本机端口号的方式获取InetAddress实例

InetAddress   address=InetAddress. getByName("admin");//通过主机名的方式获取InetAddress实例

InetAddress   address=InetAddress. getByName("1.1.1.10");//通过IP地址的方式获取InetAddress实例


提供的一些方法:

address.getHostName():返回主机名

address.getHostAddress():返回IP地址

address.getAddress();返回字节数组形式的IP地址,返回一个byte[ ]字节数组。




URL

1  URL(Uniform  Resource  Locator)统一资源定位符,表示Internet上某一资源的地址。

2  URL由两部分组成:协议名称和资源名称,中间用冒号隔开。

如http://www.imooc.com/video/2858

http为协议名称,后面的内容统称为资源名称,video为目录,2858是资源,省略了端口号。

3  在java.net包中,提供了URL类来表示URL。


URL代表一个统一资源定位符,它时指向互联网“资源”的指针。


常用方法:

URL  url2=new URL("http://www.imooc.com");   //创建一个URL对象

//根据现有的URL去创建一个新的URL。实际上是指定了更详细的资源位置

URL  url=new  URL(url,"/index.html?username=tom#test");//?后面表示参数,#后面表示锚点

url.getProtoclo():获取协议信息。 输出为:http

url.getHost() :获取主机名输出为:www.imooc.com

url.getPort():获取端口号 //如果未指定端口号,则使用默认的端口号,所以这个方法返回值为-1。输出为:-1

url.getPath():获取文件路径 输出为:/index.html

url.getFile():获取文件名 输出为:/index.html?username=tom

url.getRef():获取相对路径 输出为:test

url.getQuery():查询字符串 输出为:username=tom



URL  url=new  URL("http://www.baidu.com");

InputStream  is=url.openSteam();//通过URL的openStream方法获取URL对象所表示的资源的字节输入流

InputStreamReader  isr=new  InputStreamReader(is);//将字节输入流转换为字符输入流。此处可以利用重载的方法,在第二个参数上添加指定字符编码。

BufferedReader  br=new  BufferedReader(isr); //为字符输入流添加缓冲

String  data=null;

while((data=br.readLine())!=null){

syso("data");

}

br.close();

isr.close();

is.close();




Socket简介

TCP协议是面向连接,可靠的,有序的,以字节流的方式发送数据。


Socket通信实现步骤

1:创建ServerSocket和Socket

2:打开连接到Socket的输入/输出流

3:按照协议对Socket进行读/写操作

4:关闭输入输出流,关闭Socket


ServerSocket类

ServerSocket:此类实现服务器套接字,服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

常用的构造方法:

ServerSocket(int  port):创建绑定到特定端口的服务器套接字。

常用方法:

Socket   accept():监听并接收到此套接字的连接。

void  close():关闭此套接字

InetAdress   getInetAddress():返回此服务器套接字的本地地址。

int   getLocalPort():返回此套接字在其上监听的端口。



Socket类

Socket类实现客户端套接字

常用构造方法:

Socket(InetAddress  address,int  port):根据InetAddress实例和端口号来创建

Socket(String  host,int  port):根据主机的地址和端口号创建

常用方法

void close():关闭此套接字

InetAddress  getInetAddress():返回套接字连接的地址,返回InetAddress实例

InputStream  getInputStream():返回此套接字的输入流

OutputStream  getOutputStream():返回此套接字的输出流

void  shutdownInput():关闭Socket输入流

void  shutdownOutput():关闭Socket输出流



用Socket套接字实现服务器和客户端的交互

服务端:

public class Server {
public static void main(String[] args) throws Exception{
//1:创建一个服务器端ServerSocket,指定绑定的端口,并监听此端口
ServerSocket serverSocket=new ServerSocket(8452);
//2:调用accept()方法开始监听,,进入阻塞状态,等待客户端的连接
Socket socket=serverSocket.accept();
//3:获取输入流用,来读取客户端信息
InputStream is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);//将字节流包装成字符流
BufferedReader br=new BufferedReader(isr);//为输入流添加缓冲
String data=null;
while((data=br.readLine())!=null){
System.out.println(data);
}
socket.shutdownInput();//关闭输入流

//4:获取输出流,响应客户端的请求,返回给客户端一条信息
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
pw.write("Welcome");
pw.flush();//调用flush()方法缓冲输出

//5:关闭相应的资源
pw.close();
os.close();
br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();

}
}


客户端


public class Client {
public static void main(String[] args) throws Exception, IOException {
//1:创建客户端Socket,指定服务器地址和端口
Socket socket=new Socket("localhost",8888);
//2:获取输出流,向服务器端发送信息
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
pw.write("用户名:admin;密码:123");
pw.flush();
socket.shutdownOutput();

//获取输入流,并读取服务器端的响应信息。
InputStream is=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String data=null;
while((data=br.readLine())!=null){
System.out.println("Welcome too");
}


//4:关闭相关资源
br.close();
is.close();
pw.close();
os.close();
socket.close();
}
}


基于UPD的Socket编程

UPD协议(用户数据报协议)是无连接,不可靠的,无序的。

UPD协议以数据报作为数据传输的载体

进行数据传输时,首先需要将传输的数据定义成数据包(Datagram),在数据报中指明数据所要达到的

Socket(主机地址和端口号),然后再将数据报发送出去。


相关的类:

DatagramPacket:表示数据报包

常用的构造方法

DatagramPacket(byte[ ] buf,int  length):构造DatagramPacket,用来接收长度为length的数据包

DatagramPacket(byte[ ] buf,int  length,InetAddress  address,int  port):构造数据报包,用来将长度为length

的包发送到指定主机上的指定端口号。

DatagramSocket:此类用来发送和接收数据报包的套接字。

常用构造方法:

DatagramSocket():构造数据报套接字并将其绑定到本地主机上任何可用的端口。

DatagramSocket(int  port,InetAddress  laddr):创建数据报套接字,将其绑定到指定的本地地址。

常用方法:

void  close():关闭

InetAddress  getInetAddress():返回此套接字连接的地址。

int  getPort():返回此套接字的端口

void  send(DatagramPacket  p):从此套接字发送数据报包

void  receive(DatagramPacket  p):从此套接字接收数据报包。


服务端

public class UPDServer {
public static void main(String[] args) throws Exception {
//1:创建服务器端DatagramSocket,指定端口
DatagramSocket socket=new DatagramSocket(8452);
//2:创建数据报,用于接收客户端发送的数据
byte[] data=new byte[1024];//创建字节数组,指定接收的数据包的大小
DatagramPacket packet=new DatagramPacket(data, data.length);
//3:接收客户端发送的数据
socket.receive(packet);//此方法在接收到数据报之前会一直阻塞
//4:读取数据
String info=new String(data,0,packet.getLength());
System.out.println("我是服务器:客户端说"+info);
}
}



客户端:

public class UPDClient {
public static void main(String[] args) throws Exception {
//1:定义服务器的地址,端口号,和数据
InetAddress address=InetAddress.getByName("localhost");
int port=8452;
byte[] data="用户名:admin;密码:123".getBytes();
//2:创建数据报,包含发送的数据信息
DatagramPacket packet=new DatagramPacket(data, data.length, address,port);
//3:创建DatagramSocket对象
DatagramSocket socket=new DatagramSocket();
//4:向服务器发送数据报
socket.send(packet);
}
}




总结:

使用TCP通信传输对象:一般用到ObjectOutputStream来写对象

socket编程传递文件:利用字符流传输




0 0