Java网络编程
2023/6/12大约 3 分钟
1. 网络编程相关概念
1.1 什么是网络编程
- 网络编程可以让程序与网络上的其他设备中的程序进行数据交互
- 网络通信的基本模式:两台设备在网络上的互联,通过程序实现
- C/S:两端都需要写程序,客户端程序与服务器端程序
- B/S:只需要服务器需要写程序,客户端安装浏览器,网站
1.2 网络编程三要素
- 如何找到要通信的设备上我想做数据交互的应该
IP地址:
- 设备在网络中的地址,唯一的标识
InetAddress:

端口:
- 应用程序在设备中的唯一标识
- 端口是个逻辑概念,应用程序运行时跟外界数据交流的出口
端口号:标识正在计算机设备上运行的进程,16位的二进制表示:0~65535
端口类型:
周知端口:0~1023范围,被预先定义的知名应用占用(http/Ftp....)
注册端口:1024~49151范围,分配给用户进程或某些应用程序
动态端口:动态分配,不固定分配某个进程协议:
- 数据在网络中传输的规则

网络接口层;物联设备,物联寻址,比特流
网络层:IP,封装源和目标IP,进行路径选择
传输层:数据传输协议,TCP协议,UDP协议
应用层:应用程序:浏览器,邮箱TCP:
传输控制协议三次握手:
四次握手断开连接:
UDP;
2.UDP通信
- 无连接的,不可靠传输的协议
- 封装数据包(数据源IP,目的地IP,端口),直接发送
- 数据包的大小限制64KB以内
DatagramSocket类作为UDP协议的socket
socket:套接字(IP+端口)DatagramPacket(byte[] buf,int len,InetAddress add,int port) 数据包对象,创建len的对象到指定主机的指定端口
DatagramSocket(),DatagramSocket(int port)数据包套接字,用于联通两个主机的应用的
package 网络编程;
import java.io.IOException;
import java.net.*;
public class Sender {
public static void main(String[] args) throws IOException {
String a="hello world!";
DatagramPacket datagramPacket = new DatagramPacket(a.getBytes(), a.getBytes().length, InetAddress.getByName("127.0.0.1"), 5000);
DatagramSocket datagramSocket = new DatagramSocket();
datagramSocket.send(datagramPacket);
}
}package 网络编程;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Reciver {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket=new DatagramSocket(5000);
byte b[]=new byte[1024];
DatagramPacket datagramPacket=new DatagramPacket(b,b.length);
while (true){
datagramSocket.receive(datagramPacket);
System.out.println("就收到的数据"+new String(datagramPacket.getData(),0,datagramPacket.getLength()));}
}
}3.TCP通信:

客户端:
package 网络编程.TCP;
import java.io.*;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
Client client=new Client();
client.run();;
}
public void run() throws IOException {
//创建Socket
Socket socket=new Socket("127.0.0.1",5000);
FileInputStream fileInputStream=new FileInputStream("F:\\jack\\关于通知的json.txt");//字节流
BufferedInputStream bis=new BufferedInputStream(fileInputStream);//字节缓冲流
OutputStream os=socket.getOutputStream();
BufferedOutputStream bos=new BufferedOutputStream(os);
System.out.println("运行");
int data;
while ((data=bis.read())!=-1){
bos.write(data);
}
bos.flush();
socket.shutdownOutput();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//InputStreamReader转换流
System.out.println(br.readLine());
// 释放资源
socket.close();
os.close();
bis.close();
}
}服务端:
package 网络编程.TCP;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
Server server=new Server();
server.go();
}
public void go() throws IOException {
ServerSocket serverSocket=new ServerSocket(5000);//监听5000端口
while (true){
Socket ss = serverSocket.accept();//阻塞方式
System.out.println("接收到对象");
File file=new File("F:\\png\\hello.txt");//存放文件的地址
file.createNewFile();
FileOutputStream fileOutputStream = new FileOutputStream(file);
BufferedOutputStream bos=new BufferedOutputStream(fileOutputStream);
InputStream is = ss.getInputStream();
int data;
while ((data = is.read()) != -1){
bos.write(data);
}
PrintWriter pw = new PrintWriter(new OutputStreamWriter(ss.getOutputStream()));
pw.println("传输成功!");
pw.flush();
// 释放资源
bos.close();
ss.close();
ss.close();
}
}
}