网络编程
什么是网络编程?
-
通过我们写好的程序,能够实现数据在互联网中进行传输
-
也叫Socket编程,套接字编程
网络编程三要素?
-
IP地址
代表计算机的唯一标识
查看IP地址:ipconfig -all
-
端口号
所谓的端口,就好像是门牌号一样,客户端可以通过ip地址找到对应的服务器端,但是服务器端是有很多端口的,每个应用程序对应一个端口号,通过类似门牌号的端口号,客户端才能真正的访问到该服务器。为了对端口进行区分,将每个端口进行了编号,这就是端口号。
端口号代表应用程序的唯一标识
-
协议
计算机双方必须共同遵守的一组约定。
TCP UDP 网络通信协议
InetAddress类
此类表示互联网协议(IP)地址。
常见成员方法:
-
getByName(String host)
//通过传递主机的名字或者IP地址,来获取InetAddress对象 public static void main(String[] args) throws IOException { InetAddress inetAddress = InetAddress.getByName("计算机名称/IP地址"); //java.net.Inet4Address } }
-
getHostAddress():获取IP地址
System.out.println(inetAddress.getHostAddress());
-
getHostName() :获取主机名称(InetAddress.getByName()传的是什么就是什么)
System.out.println(inetAddress.getHostName());
在UDP协议下进行数据的传输
UDP协议的特点:
-
面向无连接
-
传输速度较快
-
传输数据不安全(相对TCP),数据容易丢失
发送端:
实现步骤:
-
创建Socket对象(创建码头)
DatagramSocket datagramSocket = new DatagramSocket();
-
写数据(拿货物)
String data = "itxiaoli";
-
创建数据报包对象,将写好的数据封装到里面(创建集装箱,将货物装进去)
货物是什么?(第一个参数:数据)
货物有多大?(第二个参数:数据的长度)
发到哪个国家?(第三个参数:IP地址)
发到哪个城市的哪个小区?(第四个参数:端口号)
DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(),data.getBytes().length, InetAddress.getByName("127.0.0.1"),8000);
-
发送数据(发货)
datagramSocket.send(datagramPacket);
-
释放资源(关码头)
datagramSocket.close();
接收端:
实现步骤:
-
创建Socket对象(创建码头)
-
创建数据报包对象(创建集装箱)
-
接收数据(接受货物)
-
解析数据(拆箱验货)
-
关闭资源(关码头)
// 1. 创建Socket对象(创建码头) DatagramSocket ds = new DatagramSocket(8000); // 2. 创建数据报包对象(创建集装箱) byte[] bytes = new byte[1024]; DatagramPacket dp = new DatagramPacket(bytes,bytes.length); // 3. 接收数据(接受货物) ds.receive(dp); // 4. 解析数据(拆箱验货) String ip = dp.getAddress().getHostAddress();//获取该货物从哪里来的 String data = new String(bytes,0,dp.getLength());//获取数据 System.out.println(ip+"~~~~"+data); // 5. 关闭资源(关码头) ds.close();
*在TCP协议下进行数据的传输
TCP协议的特点:
-
面向有连接
-
传输数据较慢
-
传输数据较(UDP)安全
实现步骤:
发送端:
-
创建Socket对象
Socket s = new Socket("123.453.654.1",12345);
-
写数据
String data = "itxiaoli";
-
获取管道从输出流对象
OutputString os = s.getOutputStream();
-
写出数据
os.write(data.getBytes());
-
数据资源
s.close();
接收端:
-
创建Socket对象
ServerSocket serverSocket = new ServerSocket(12345);
-
监听连接
Socket accept = serverSocket.accept();
-
获取管道输入流对象
InputStream inputStream = accept.getInputStream();
-
读取数据
byte[] b = new byte[1024]; int len = inputStream.read(b); String data = new String(b,0,len); System.out.println(data);
-
释放资源
serverSocket.close();//断开连接 accept.close();//关闭码头
发送一个对象:
创建Person对象
package com.itxiaoli.TCP; import java.io.Serializable; public class Person implements Serializable { private String name; private int age; public Person() { } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Person(String name, int age) { this.name = name; this.age = age; } }
Receive
package com.itxiaoli.TCP; import java.io.ObjectInputStream; import java.net.ServerSocket; import java.net.Socket; public class Service_1 { public static void main(String[] args) throws Exception{ //创建Socket对象 ServerSocket ss = new ServerSocket(12315); //监听连接 Socket s = ss.accept(); //获取输入管道流对象 ObjectInputStream ois = new ObjectInputStream(s.getInputStream()); //读取数据 Person p= (Person) ois.readObject(); System.out.println(p.getName()+p.getAge()); //释放资源 s.close(); ss.close(); } }
Send
package com.itxiaoli.TCP; import java.io.ObjectOutputStream; import java.net.Socket; public class Send_1 { public static void main(String[] args) throws Exception{ //创建Socket对象 Socket s = new Socket("132.456.78.3",12315); //写数据 Person p = new Person("itxiaoli",12); //获取管道输出流对象 ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream()); //写数据 oos.writeObject(p); //释放资源 s.close(); } }
包装成字符流
//获取管道输出流对象 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); //写数据 bw.write(data); //刷新 bw.flush(); //获取管道输入流对象 BufferedReader br = new BufferedReader(new InpuStreamReader(s.getInputStream())); //读取数据,一次读取一行 String data = br.readLine();
双向传输:
Send:
package com.itxiaoli.TCP; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; public class Send_2 { public static void main(String[] args) throws Exception { Socket s = new Socket("192.168.1.1",9090); String data = "123"; //发送 OutputStream os = s.getOutputStream(); os.write(data.getBytes()); //接收 InputStream is = s.getInputStream(); byte[] b = new byte[1024]; int len = is.read(b); String data1 = new String(b,0,len); System.out.println(data1); s.close(); } }
Receive:
package com.itxiaoli.TCP; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Receive_2 { public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(9090); Socket s = ss.accept(); //接收 InputStream is = s.getInputStream(); byte[] b = new byte[1024]; int len = is.read(b); String data = new String(b,0,len); System.out.println(data); //发送 OutputStream os = s.getOutputStream(); os.write("hhhhh".getBytes()); s.close(); ss.close(); } }
服务器数据写入文本文件
public class Receive_3 { public static void main(String[] args) throws Exception{ // 创建Socket对象 ServerSocket ss = new ServerSocket(12312); // 监听 Socket s = ss.accept(); // 获取输入流对象 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); // 创建高效字符输出流对象 BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt")); // 一次读一行 String line = null; while ((line = br.readLine() )!=null ){ bw.write(line); bw.newLine(); bw.flush(); } // 释放资源 bw.close(); s.close(); ss.close(); } }
服务器数据读取文本文件
public static void main(String[] args) throws Exception{ //创建Socket对象 Socket s = new Socket("192.168.123.1",12312); //创建高效出入流对象 BufferedReader br = new BufferedReader(new FileReader("a.txt")); //管道输出流 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); //读取一行 // 写一行 String line = null; while ((line =br.readLine()) != null){ bw.write(line); bw.newLine();; bw.flush(); } // 释放资源 s.close(); br.close(); }