网络编程
网络编程的概述:1:Java是Internet上的语言,它从语言上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。2.Java提供的网络内库,可以实现互通的网络连接,网络的底层细节被隐藏在Java的本机安装系统里面,由JVM进行控制,并且Java实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境。
要想实现网络编程,需要考虑以下两个问题:
问题一:要想实现网络传输,需要考虑的问题有哪些?
1.使用Ip地址定位互联网一台主机;使用端口号定位一个应用。
2.要想是想网络传输,要先创建一个InetAdderss类,我们通过以下方式建立InetAdderss类:
InetAdderss inet1=InetAdderss.getByName(host);//这里host是指知己的IP地址
②InetAddress inet1 = InetAddress.getLocalHost(); //获取本机的InetAddress对象
3.①String hostName = inet.getHostName(); //获取域名
②String hostAddress = inet.getHostAddress();//返回主机IP地址
问题二:如何才能进行可靠的、高效的数据传输?
要使实现可靠、高效的数据传输,必须通过网络通信协议。根据下图,了解网络通信协议:
在java.net包中提供了两种常见的网络协议的支持:
①TCP:TCP是传输控协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称为TCP/IP。
②UDP:UDP是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。
TCP和UDP的优缺点:
1、TCP协议
①使用TCP协议前,须建立TCP链接,形成传输数据通道。
②传输前,采用“三次握手”方式,是可靠的。
③TCP协议进行通信的两个应用进程:客户端、服务端。
④在连接中可进行大数据量的传输。
⑤传输完毕,需释放已建立的连接,效率低。
2.UDP协议
①将数据、源、目的封装成数据包,不需要建立连接。
②每个数据报的大小限制在64K内。
③因无需连接,故是不可靠的。
④发送数据结束时无需释放资源,速度快。
四、Socket 编程
套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。
当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行进行通信。
java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。
InetAdderss的测试:
public class MyTest7 {
public static void main(String[] args) throws UnknownHostException {
//获得本机ip
InetAddress ip= InetAddress.getLocalHost();
System.out.println(ip);
//获得本机ip地址
String hostAddress = ip.getHostAddress();
System.out.println(hostAddress);
//获得本机主机名
String hostName = ip.getHostName();
System.out.println(hostName);
}
}
public class MyTest7 {
public static void main(String[] args) throws UnknownHostException {
InetAddress name = InetAddress.getByName("www.jd.com");
//获得IP地址
String hostAddress = name.getHostAddress();
//获得域名
String hostName = name.getHostName();
System.out.println(hostAddress);
System.out.println(hostName);
}
}
端口测试:
public class MyTest7 {
public static void main(String[] args) throws UnknownHostException {
InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8082);
String hostName = socketAddress.getHostName();
System.out.println(hostName);
//或的端口名
int port = socketAddress.getPort();
System.out.println(port);
}
}
URL测试:
URL类有多种形式的构造函数:
(1) URL ( String url)
//url代表一个绝对地址,URL对象直接指向这个资源,如:
URL urll=new URL(http://www.cqwu.edu.cn);
(2) URL ( URL baseURL , String relativeURL)
// 其中,baseURL代表绝对地址,relativeURL代表相对地址。如:
URL urll=new URL(http://www.cqwu.edu.cn);
URL lib=new URL(urll , “library / library.asp”);
(3) URL ( String protocol , String host , String file)
//其中,protocol代表通信协议,host代表主机名,file代表文件名。如:
new URL (“http” , www.cqwu.edu.cn, “/ test / test.asp”);
(4) URL ( String protocol , String host , int port , String file)
URL lib = new URL (“http” , www.cqwu.edu.cn, 80 , “/ test / test.asp”);
2、获取URL对象的属性
getDefaultPort(): 返回默认的端口号。
getFile(): 获得URL指定资源的完整文件名。
getHost(): 返回主机名。
getPath(): 返回指定资源的文件目录和文件名。
getPort(): 返回端口号,默认为-1。
getProtocol(): 返回表示URL中协议的字符串对象。
getRef(): 返回URL中的HTML文档标记,即#号标记。
getUserInfo: 返回用户信息。
toString: 返回完整的URL字符串。
UDP编程:
1.UDP网络通信
①类 DatagramSocket 和 DatagramPacket 实现了基于UDP协议的网络程序。
②UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不确定什么时候可以抵达。
③DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。
④UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的链接。
2.UDP网络通信流程:
①DatagramSocket 和 DatagramPacket。
②建立发送端,接收端。
③建立数据包。
④调用 Scoket 的发送、接收方法。
⑤关闭 Scoket。
3.发送端与接收端是两个独立的运行程序。
接收方:
public class peopleOne {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(5051);
byte[] receiveBuf = new byte[1024];
DatagramPacket packet = new DatagramPacket(receiveBuf, receiveBuf.length);
System.out.println("等你包裹来");
while (true){
socket.receive(packet);
String s = new String(packet.getData(),0, packet.getLength());
System.out.println("你收到消息: "+s);
if ("886".equals(s)){
break;
}
}
socket.close();
}
}
发送方
public class peopleTwo {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
InetAddress address = InetAddress.getByName("127.0.0.1");
int port=5051;
byte[] sendBuf = new byte[1024];
Scanner sc =null;
while (true){
sc= new Scanner(System.in);
System.out.println("请输入你要发的内容");
String s= sc.next();
sendBuf=s.getBytes();
DatagramPacket packet = new DatagramPacket(sendBuf, 0, sendBuf.length,address,port);
socket.send(packet);
if ("886".equals(sc.nextLine())){
break;
}
}
socket.close();
}
}
TCP编程:
以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:
①服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。
②服务器调用 ServerSocket 类 的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
③服务器正在等待时,一个客户端实例化一个Socket对象,指定服务器名称和端口号来请求连接。
④Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。
⑤在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。
⑥连接建立后,通过使用I/O流在进行通信。每一个 socket 都有一个输出流和一个输入流。客户端的输出流连接到服务器端的输入流,而客户端的输入 流连接到服务器端的输出流。
服务器
public class TestServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(6060);
System.out.println("开启了服务器");
while (true){
Socket accept = serverSocket.accept();
System.out.println("连入了一个用户");
DataInputStream dis = new DataInputStream(accept.getInputStream());
System.out.println(dis.readUTF());
if ("886".equals(dis.readUTF())){
System.out.println("结束了连接");
break;
}
}
}
}
客户端
public class TestClient {
public static void main(String[] args) throws IOException {
while (true){
Socket socket = new Socket("127.0.0.1", 6060);
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
Scanner sc = new Scanner(System.in);
System.out.println("请输入");
String string = sc.nextLine();
dos.writeUTF(string);
if ("886".equals(string)){
break;
}
}
}
}