网络编程
网络编程:用Java语言实现计算机间数据的信息传递和资源共享
网络模型:OSI(Open System Interconnection)开放互连参考模型,TCP/IP 参考模型
网络通信的三要素:
- IP地址:网络中计算机的唯一标识。
- DOS命令:ipconfig
- 端口:正在运行的程序的标识。
- 协议:通信的规则。
127.0.0.1回环地址(表示本机)
IP以及端口号
package com.wenhua.javaNetWork.inetaddress;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* 通过java.net.InetAddress类获取得到服务器的信息
*
* @author ASUS
*
*/
public class addressGetByName {
public static void main(String[] args) throws UnknownHostException {
// 通过DNS服务器解析域名对应的ip 注意:连网
InetAddress inet = InetAddress.getByName("www.baidu.com");
System.out.println(inet);
System.out.println(inet.getHostAddress());
System.out.println(inet.getHostName());
System.out.println(inet.getAddress());
System.out.println(inet.getClass());
}
}
运行结果
www.baidu.com/36.152.44.95
36.152.44.95
www.baidu.com
[B@7852e922
class java.net.Inet4Address
UDP协议
服务端
package com.wenhua.javaNetWork.UDPsocket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.security.spec.DSAGenParameterSpec;
/**
* 服务端
*
* @author ASUS
*
*/
public class Server {
/*
* UDP协议接收数据:
* A:创建接收端Socket对象
* B:创建一个数据包(接收容器)
* C:调用socket对象的接收方法接收
* D:解析数据包,并显示在控制台
* E:释放资源
*/
public static void main(String[] args) throws IOException {
// 创建接收端Socket对象
// public class DatagramSocket 此类表示用于发送和接收数据报数据包的套接字。
// DatagramSocket(int port)
DatagramSocket datagramSocket = new DatagramSocket(9999);
// 创建一个数据包(接收容器)
byte[] bs = new byte[1024];
int length = bs.length;
// DatagramPacket(byte[] buf, int length)
// 构造一个 DatagramPacket用于接收长度的数据包 length 。
DatagramPacket datagramPacket = new DatagramPacket(bs,length);
// 接收数据包
// void receive(DatagramPacket p) 阻塞式
datagramSocket.receive(datagramPacket);
// 解析搜数据包,
// byte[] getData() 返回数据缓冲区。
byte[] bs2 = datagramPacket.getData();
// int getLength() 返回要发送的数据的长度或接收到的数据的长度。
int len = datagramPacket.getLength();
String string = new String(bs2,0,len,"utf-8");
// 显示在控制台
System.out.println(string);
// 释放资源
datagramSocket.close();
}
}
客户端
package com.wenhua.javaNetWork.UDPsocket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 客户端
*
* @author ASUS
*
*/
public class Client {
/*
* UDP协议发送数据:
* A:创建发送端Socket对象
* B:创建数据,并把数据打包
* C:调用Socket对象的发送方法发送数据包
* D:释放资源
*/
public static void main(String[] args) throws Exception {
// 创建UDP协议socket,无需建立连接,创建发送端Socket对象
DatagramSocket datagramSocket = new DatagramSocket();
// 创建数据报(封装数据和目标地址),并把数据打包
byte[] bs = "你好".getBytes("utf-8");
// 长度
int length = bs.length;
// IP地址
InetAddress address = InetAddress.getByName("127.0.0.1");
// 端口号
int port = 9999;
// public final class DatagramPacket 该类表示数据报包。
// DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) 构造用于发送长度的分组数据报包 length具有偏移 ioffset指定主机上到指定的端口号。
DatagramPacket packet = new DatagramPacket(bs,length,address,port);
// 调用Socket对象的发送方法发送数据包
// public void send(DatagramPacket p)
datagramSocket.send(packet);
// 释放资源
datagramSocket.close();
}
}
运行结果
你好
TCP协议
服务端
package com.wenhua.javaNetWork.TCPsocket.finish;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/**
* 服务端
*
* @author ASUS
*
*/
public class Server {
public static void main(String[] args) throws IOException {
// 创建服务器端Socket对象ServerSocket(int port)
ServerSocket serverSocket = new ServerSocket(9999);
// 在服务器监听,有没有客户端访问服务器,阻塞式(程序运行这就停止,等待)
Socket socket = serverSocket.accept();
InetAddress intet = null;
InputStream in = null;
OutputStream out = null;
byte[] b = new byte[1024];
Scanner input = new Scanner(System.in);
try {
while(serverSocket != null) {
// 获取输入流,接收客户端发送的消息
in = socket.getInputStream();
int length = in.read(b);
// byte数组转换为字符串
String string = new String(b, 0, length, "utf-8");
System.out.println(serverSocket.getLocalPort()+":"+string);
// 获得输出流对象
out = socket.getOutputStream();
System.out.println("请给客户端回复消息:");
out.write(input.next().getBytes("utf-8"));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(out != null) {
out.close();
}
if(in != null) {
in.close();
}
if(socket != null) {
socket.close();
}
serverSocket.close();
}
}
}
客户端
package com.wenhua.javaNetWork.TCPsocket.finish;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/**
* 客户端
*
* @author ASUS
*
*/
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
// 在客户端创建socket对象,向服务器发送数据
Socket socket = new Socket("127.0.0.1", 9999);
OutputStream out = null;
InputStream in = null;
byte[] b = new byte[1024];
Scanner input = new Scanner(System.in);
try {
while(socket != null) {
// 获得输出流对象
out = socket.getOutputStream();
System.out.println("客户端发送请求:");
out.write(input.next().getBytes("utf-8"));
// 获取输入流,接收客户端发送的消息
in = socket.getInputStream();
int length = in.read(b);
// byte数组转换为字符串
String string = new String(b, 0, length, "utf-8");
System.out.println(socket.getInetAddress()+":"+string);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(out != null) {
out.close();
}
socket.close();
}
}
}