Java笔记 - 网络编程
计算机网络
网络编程三要素
- IP地址 - 设备的标识
- 端口 - 标识设备中的应用程序
- 协议 - 对数据的传输格式、速率做统一规定
IP地址
Java提供了一个 InetAddress 类供我们使用
方法 | 说明 |
---|---|
getByName | 获取主机的ip地址 |
getHostName | 获取此ip地址的主机名 |
getHostAddress | 返回文本显示中的ip地址字符串 |
此处存疑
public class IPdemo1 {
public static void main(String[] args) throws UnknownHostException {
InetAddress address = InetAddress.getByName("mac");
String hostName = address.getHostName();
String hostAddress = address.getHostAddress();
System.out.println(hostName);
System.out.println(hostAddress);
}
}
UDP
UDP是一种不可靠的交付
UDP发送数据
步骤
-
创建发送端的Socket对象
-
创建数据,并打包
-
调用DatagramSocket 对象的方法发送数据
-
关闭发送端
-
public class DsDemo { public static void main(String[] args) throws IOException { //1.创建一个udp对象 DatagramSocket ds = new DatagramSocket(); //2.创建数据 byte[] bytes = "helloworld".getBytes(); int len = bytes.length; InetAddress address = InetAddress.getByName("192.168.0.102"); int post = 10086; DatagramPacket dp = new DatagramPacket(bytes, len, address, post); //3.发送数据 ds.send(dp); //4.关闭发送端 ds.close(); } }
UDP接收数据
-
创建接收端的Socket对象
-
创建一个数据包,用来接收数据
-
调用DatagramSocket对象的方法接收数据
-
解析数据包,并把数据输出在控制台
-
public class ReceiveDemo { public static void main(String[] args) throws IOException { //1.创建一个udp对象 DatagramSocket ds = new DatagramSocket(10086); //2.创建数据包 byte[] bytes = new byte[1024]; DatagramPacket dp = new DatagramPacket(bytes,bytes.length); //3.解析数据包 ds.receive(dp); byte[] newBytes = dp.getData(); String s = new String(newBytes,0,dp.getLength()); System.out.println(s); //4.关闭 ds.close(); } }
使用键盘录入
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
TCP
TCP发送数据
-
创建客户端的Socket对象
此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
Socket(InetAddress address, int port)
创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 -
获取输出流,写数据
OutputStream os = s.getOutputStream();
-
释放资源
和UDP相比少了创建packet的步骤
TCP接收数据
- 创建服务器端的Socket对象
- 获取输入流,读数据
- 释放资源
SOCKET
套接字使用TCP提供了两台计算机之间的通信机制。
客户端程序创建一个套接字,并尝试连接服务器的套接字。
当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。
java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。
以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:
- 服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。
- 服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
- 服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。
- Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。
- 在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。
连接建立后,通过使用 I/O 流在进行通信,每一个socket都有一个输出流和一个输入流,客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。
练习
实现从客户端读取文件,在服务器保存该文件
public class ClientDemo {
public static void main(String[] args) throws IOException {
Socket s = new Socket("192.168.0.102", 10086);
BufferedReader br = new BufferedReader(new FileReader("day08/java.txt"));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
br.close();
s.close();
}
}
public class ServerDemo {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(10086);
//监听客户端连接
Socket s = ss.accept();
InputStream is = s.getInputStream(); //字节流
BufferedReader br = new BufferedReader(new InputStreamReader(is)); //字节转字符流,并且包装成高级Buffer流
BufferedWriter bw = new BufferedWriter(new FileWriter("day08/copy.txt"));
String line;
while((line = br.readLine())!=null){
//System.out.println(line);
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
s.close();
ss.close();
}
}
上一篇: JVM ,类的加载过程中,init 和 clinit 区别
下一篇: Java网络编程-学习笔记