【JavaSE学习笔记】- 网络编程
2013-11-27 20:04
501 查看
Java 学习--网络编程(一)
关键字:InetAddress UDP TCP Socket
静态的getByName方法可以返回代表某个主机的InetAddress对象:
InetAddress address = InetAddress.getByName("time-A.thimefreq.bldrdoc.gov");
可以使用getAddress方法来访问InetAddress对象里面封装好的序列:
byte[] addressBytes = address.getAddress();
还可以通过调用getAllByName方法来获得所有主机:
InetAddress[] addresses = InetAddress.getAllByName(host);
有时候还需要知道本地主机的地址,此时可以使用静态的getLocalHost方法来得到本地主机的地址:
InetAddress address = InetAddress.getLocalHost();
示例如下:
3、
TCP 是Tranfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。
UDP 是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
TCP和UDP的区别:
TCP:面向连接 | 传输可靠性可靠 | 传输大量数据 | 速度慢
UDP:面向非连接| 传输可靠性不可靠 | 传输少量数据 | 速度快
4、
此类实现客户端套接字,套接字是两台机器间通信的端点。 Socket是为网络服务提供的 一种机制,网络通信其实就是Socket之间的通信。
这个程序关键的几行代码:
Socket s = new Socket("time-A.timefreq.bldrdoc.gov",13);
Scanner in = new Scanner(inStream);
第一行代码用于打开一个套接字,他是网络软件的一个抽象概念,负责时能该程序内部与外部之间的通信。我们将远程地址和端口号传递给套接字的构造器,如果连接失败它将跑出一个UnknowHostException异常,如果存在其他异常抛出IOException异常。
第二行代码,一旦套接字被打开,java.net.Socket类中的getInputStream方法会返回一个InputStream对象,一旦获得这个流,该程序将直接把每一行打印到输出,这个过程一直持续到流发送完毕并且服务器断开连接为止。
首先要了解两个类:
DatagramSocket 此类表示用来发送和接收数据报包的套接字。 构造方法:DatagramSocket(int
port) 创建数据报套接字并将其绑定到本地主机上的指定端口
DatagramPacket 此类表示数据报包,数据报包用来实现无连接包投递服务。构造方法:DatagramPacket(byte[]
buf, int length, SocketAddress address) 构造数据报包,用来将长度为 length 的包发送。
发送端:
1)通过DatagramSocket创建udp的Socket服务:
DatagramSocket ds = new DatagramSocket();
2)确定数据,并封装成数据包:
DatagramPacket dp = new DatagramPacket(…….);
3)通过UDP的Socket服务将已有的数据包发送出去:
ds.send(dp);
4)关闭资源:
ds.close();
接收端:
1) 通过DatagramSocket创建udp的Socket服务,通常在这里设置一个监听端口,用以指定该接收断处理哪个端口发来的数据:DatagramSocket
ds = newDatagramSocket(int mark);
2) 定义一个用来存储接收到的数据的空数据包:
DatagramPacket dp = newDatagramPacket(…….);
3) 通过udp的Socket服务将将接收到的数据包存储在第2步中定义的空数据包中。
ds.receive(dp);
4) 通过数据包的方法获取器中的数据。
InetAddress getAddress()返回某台机器的
IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
byte[] getData() 返回数据缓冲区。
int getLength() 返回将要发送或接收到的数据的长度。
int getOffset()返回将要发送或接收到的数据的偏移量。
int getPort()返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。
SocketAddress getSocketAddress()获取要将此包发送到的或发出此数据报的远程主机的
SocketAddress (IP 地址 + 端号)
5) 关闭资源:
ds.close();
客户端:
1)建立Socket服务,指定要连接的主机和端口:
Socket s = new Socket(Stringhost, int port);
2)获取Socket流中的输出流,将数据写到该流中,通过网络发送给服务端:
OutputStream out = s.getOutputStream();
3)获取Socket流中的输入流,获取服务端反馈的信息:
InputStream in = s.getInputStream();
4)关闭客户端:
s.close();
服务端:
1) 建立ServerSocket服务,指定要接收的端口:
ServerSocket server = newServerSocket (int port);
2) 获取连接到服务端的客户端Socket:
Socket socket = s.accept();
3) 获取Socket流中的输出流,将数据写到该流中,通过网络发送给服务端:
OutputStream out =socket .getOutputStream();
4)获取Socket流中的输入流,获取服务端反馈的信息:
InputStream in =socket .getInputStream();0
5) 关闭客户端:
socket .close();
6) 关闭服务端:
server.close();
7、 使用SeverSocket实现服务器
API:java.net.ServerSocket 1.0
ServerSocket(int port) 创建一个监控端口的服务器套接字
Socket accept() 等待连接,该方法阻塞当前线程知道建立连接为止
void close() 关闭服务器套接字
1)建立一个负责监控端口8189的服务器
ServerSocket s = new ServerSocket(8189);
2)告诉程序不停地等待知道有客户端连接到这个端口。
Socket incoming = s.accept();
3)使用这个Socket对象得到输入流和输出流
InputStream inStream = incoming.getInputStream();
OutputStream outStream = incoming.getOutputStream();
4)将流转换成扫描器和写入器,以便通过套接字来发送文本
Scanner in = new Scanner(inStream);
PrintWriter out = new PrintWriter(outStream,true /*autoFlush*/);
5)对输入进行计算并返回处理结果
String line = in.nextLine();
out.println("Echo:"+line);
6)在代码的最后,我们关闭连接进来的套接字
incoming.close();
示例如下:
关键字:InetAddress UDP TCP Socket
1、网络参考模型
OSI参考模型 | TCP/IP参考模型 |
应用层 | 应用层 |
表示层 | |
会话层 | |
传输层 | 传输层 |
网络层 | 网际层 |
数据链路层 | 主机 及网络层 |
物理层 |
2、IP地址:InetAddress类
此类表示互联网协议 (IP) 地址。如果需要在主机名和因特网地址之间进行转换时就需要用到该类。常用方法如下:静态的getByName方法可以返回代表某个主机的InetAddress对象:
InetAddress address = InetAddress.getByName("time-A.thimefreq.bldrdoc.gov");
可以使用getAddress方法来访问InetAddress对象里面封装好的序列:
byte[] addressBytes = address.getAddress();
还可以通过调用getAllByName方法来获得所有主机:
InetAddress[] addresses = InetAddress.getAllByName(host);
有时候还需要知道本地主机的地址,此时可以使用静态的getLocalHost方法来得到本地主机的地址:
InetAddress address = InetAddress.getLocalHost();
示例如下:
import java.net.*; class InetAddressTest { public static void main(String[] args) { try{ if(args > 0) { String host = args[0]; InetAddress[] address = InetAddress.getAllByName(host); for(InetAddress a:address) { System.out.println(a); } }else { InetAddress localHostAddress = InetAddress.getLocalHost(); System.out.println(localHostAddress); } } catch (Exception e) { e.printStackTrace(); } } }
3、
传输协议:UDP和TCP
TCP 是Tranfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。UDP 是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
TCP和UDP的区别:
TCP:面向连接 | 传输可靠性可靠 | 传输大量数据 | 速度慢
UDP:面向非连接| 传输可靠性不可靠 | 传输少量数据 | 速度快
4、
Socket
此类实现客户端套接字,套接字是两台机器间通信的端点。 Socket是为网络服务提供的 一种机制,网络通信其实就是Socket之间的通信。try{ Socket s = new Socket("time-A.timefreq.bldrdoc.gov",13); try{ InputStream inStream = s.getInputStream(); Scanner in = new Scanner(inStream); while(in.hasNextLine()){ String line = in.nextLine(); System.out.println(line); } } finally{ s.close(); } } catch(IOException e){ e.printStackTrace(); }
这个程序关键的几行代码:
Socket s = new Socket("time-A.timefreq.bldrdoc.gov",13);
Scanner in = new Scanner(inStream);
第一行代码用于打开一个套接字,他是网络软件的一个抽象概念,负责时能该程序内部与外部之间的通信。我们将远程地址和端口号传递给套接字的构造器,如果连接失败它将跑出一个UnknowHostException异常,如果存在其他异常抛出IOException异常。
第二行代码,一旦套接字被打开,java.net.Socket类中的getInputStream方法会返回一个InputStream对象,一旦获得这个流,该程序将直接把每一行打印到输出,这个过程一直持续到流发送完毕并且服务器断开连接为止。
5、 UDP的Socket建立:
DatagramSocket 此类表示用来发送和接收数据报包的套接字。 构造方法:DatagramSocket(int
port) 创建数据报套接字并将其绑定到本地主机上的指定端口
DatagramPacket 此类表示数据报包,数据报包用来实现无连接包投递服务。构造方法:DatagramPacket(byte[]
buf, int length, SocketAddress address) 构造数据报包,用来将长度为 length 的包发送。
发送端:
1)通过DatagramSocket创建udp的Socket服务:
DatagramSocket ds = new DatagramSocket();
2)确定数据,并封装成数据包:
DatagramPacket dp = new DatagramPacket(…….);
3)通过UDP的Socket服务将已有的数据包发送出去:
ds.send(dp);
4)关闭资源:
ds.close();
接收端:
1) 通过DatagramSocket创建udp的Socket服务,通常在这里设置一个监听端口,用以指定该接收断处理哪个端口发来的数据:DatagramSocket
ds = newDatagramSocket(int mark);
2) 定义一个用来存储接收到的数据的空数据包:
DatagramPacket dp = newDatagramPacket(…….);
3) 通过udp的Socket服务将将接收到的数据包存储在第2步中定义的空数据包中。
ds.receive(dp);
4) 通过数据包的方法获取器中的数据。
InetAddress getAddress()返回某台机器的
IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
byte[] getData() 返回数据缓冲区。
int getLength() 返回将要发送或接收到的数据的长度。
int getOffset()返回将要发送或接收到的数据的偏移量。
int getPort()返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。
SocketAddress getSocketAddress()获取要将此包发送到的或发出此数据报的远程主机的
SocketAddress (IP 地址 + 端号)
5) 关闭资源:
ds.close();
6、 TCP的Socket建立:
TCP的Socket建立主要涉及两个类Socket类与ServerSocket类。Socket类实现客户端套接字(也可以就叫“套接字”可以称为端口)。套接字是两台机器间通信的端点。ServerSocket类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。客户端:
1)建立Socket服务,指定要连接的主机和端口:
Socket s = new Socket(Stringhost, int port);
2)获取Socket流中的输出流,将数据写到该流中,通过网络发送给服务端:
OutputStream out = s.getOutputStream();
3)获取Socket流中的输入流,获取服务端反馈的信息:
InputStream in = s.getInputStream();
4)关闭客户端:
s.close();
服务端:
1) 建立ServerSocket服务,指定要接收的端口:
ServerSocket server = newServerSocket (int port);
2) 获取连接到服务端的客户端Socket:
Socket socket = s.accept();
3) 获取Socket流中的输出流,将数据写到该流中,通过网络发送给服务端:
OutputStream out =socket .getOutputStream();
4)获取Socket流中的输入流,获取服务端反馈的信息:
InputStream in =socket .getInputStream();0
5) 关闭客户端:
socket .close();
6) 关闭服务端:
server.close();
7、 使用SeverSocket实现服务器
API:java.net.ServerSocket 1.0
ServerSocket(int port) 创建一个监控端口的服务器套接字
Socket accept() 等待连接,该方法阻塞当前线程知道建立连接为止
void close() 关闭服务器套接字
1)建立一个负责监控端口8189的服务器
ServerSocket s = new ServerSocket(8189);
2)告诉程序不停地等待知道有客户端连接到这个端口。
Socket incoming = s.accept();
3)使用这个Socket对象得到输入流和输出流
InputStream inStream = incoming.getInputStream();
OutputStream outStream = incoming.getOutputStream();
4)将流转换成扫描器和写入器,以便通过套接字来发送文本
Scanner in = new Scanner(inStream);
PrintWriter out = new PrintWriter(outStream,true /*autoFlush*/);
5)对输入进行计算并返回处理结果
String line = in.nextLine();
out.println("Echo:"+line);
6)在代码的最后,我们关闭连接进来的套接字
incoming.close();
示例如下:
import java.io.*; import java.net.*; import java.util.*; class EchoServer { public static void main(String[] args) { try { ServerSocket s = new ServerSocket(8189); Socket incoming = s.accept(); try { InputStream input = incoming.getInputStream(); OutputStream output = incoming.getOutputStream(); Scanner in = new Scanner(input); PrintWriter out = new PrintWriter(output,true/*autoFlush*/); out.println("Hello!Enter BYE to exit."); boolean done = false; while(!done && in.hasNextLine()) { String line = in.nextLine(); out.println("Echo: "+line); if(line.trim().equals("BYE") done = true; } } finally { incoming.close(); } } catch (IOException e) { incoming.close(); } } }
相关文章推荐
- 学习笔记之JavaSE(50)--网络编程2
- 学习笔记_JavaSE_26_网络编程
- 学习笔记之JavaSE(51)--网络编程3
- 【JavaSE学习笔记】网络编程_UDP协议,TCP协议
- JavaSE学习笔记--网络编程之UDP
- 学习笔记之JavaSE(53)--网络编程5
- 学习笔记之JavaSE(49)--网络编程1
- JAVASE学习笔记:第十三章 多线程和网络编程
- JavaSE学习笔记之网络编程
- 网络编程学习笔记一:Socket编程
- 网络编程学习笔记-MAC地址和IP地址的关系
- [Linux网络编程学习笔记]索引
- 网络编程学习笔记整理(二)
- 黑马程序员-自己总结的java学习笔记(8)网络编程
- Python学习笔记(七) -- Python Socket 网络编程
- Java学习笔记52(网络编程:UDP协议案例)
- Linux-网络编程学习笔记之tcp
- 黑马程序员_Javase 网络编程学习总结
- 黑马程序员--Java基础学习笔记【单例设计模式、网络编程、反射】
- Java网络编程学习笔记(4)非阻塞通信