网络编程三要素
ip地址:计算机在网络中的唯一标识
端口:应用程序在计算机中唯一标识
协议:通信协议,常见有UDP和TCP协议
InetAddress类
表示Internet协议地址
//返回InetAddress对象
InetAddress byName = InetAddress.getByName("DESKTOP-1ET1T7L");//返回计算机名
String hostName = byName.getHostName();//返回Ip地址
String hostAddress = byName.getHostAddress();
端口
端口号:用两个字节表示的整数,它的取值范围是0~ 65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被占用,会导致程序启动失败
协议
计算机网络中,连接和通信的规则被称为网络通信协议
UDP协议
用户数据报协议(User Datagram Protocol)
UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接
UDP协议消耗系统资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输
TCP协议
传输控制协议 (Transmission Control Protocol)
TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。
在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”
三次握手:
第一次握手,客户端向服务器端发出连接请求,等待服务器确认
第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求
第三次握手,客户端再次向服务器端发送确认信息,确认连接
UDP发送数据
Java提供了DatagramSocket类作为基于UDP协议的Socket
构造方法
相关方法
//创建一个发送数据Socket对象
DatagramSocket ds=new DatagramSocket();
//创建一个包,用于存放要发送的数据
byte[] bys="hello".getBytes();
DatagramPacket dp=new DatagramPacket(bys,bys.length, InetAddress.getByName("127.0.0.1"),8888);
//发送数据
ds.send(dp);
ds.close();
UDP接受数据
构造方法
方法名 | 说明 |
---|---|
DatagramPacket(byte[] buf, int len) | 创建一个DatagramPacket用于接收长度为len的数据包 |
相关方法
//创建一个接收端的Socket对象
DatagramSocket ds=new DatagramSocket(8888);
//创建一个接受数据的包
byte[] bys=new byte[1024];
DatagramPacket dp=new DatagramPacket(bys,bys.length);
//接收数据
ds.receive(dp);
//获取数据
byte[] data = dp.getData();
//dp.getLength是接受到的数据长度
System.out.println(new String(data,0,dp.getLength()));
ds.close();
UDP三种通讯方式
单播:两个主机之间的端对通信
组播:对一组特定的主机进行通信
广播:一个主机对整个局域网所有主机通信
组播代码实现:
//发送端
//创建发送端的Socket对象
DatagramSocket ds=new DatagramSocket();
//创建数据包,
byte[] bys="hello".getBytes();
DatagramPacket dp=new DatagramPacket(bys,bys.length, InetAddress.getByName("224.0.1.1"),8888);
//发送
ds.send(dp);
//释放资源
ds.close();
//========================================================
//接收端//创建一个接收端的Socket对象
MulticastSocket ms=new MulticastSocket(8888);
//创建一个接受数据的包
byte[] bys=new byte[1024];
DatagramPacket dp=new DatagramPacket(bys,bys.length);//把当前电脑绑定一个组播地址
ms.joinGroup(InetAddress.getByName("224.0.1.1"));//接收数据
ms.receive(dp);
//获取数据
byte[] data = dp.getData();
//dp.getLength是接受到的数据长度
System.out.println(new String(data,0,dp.getLength()));
ms.close();
TCP发送数据
客户端用用Socket类,
服务器端用ServerSocket类
Socket构造方法
相关方法方
//创建一个客户端Socket对象
Socket s=new Socket("127.0.0.1",8888);
//获取输出流,输出数据
OutputStream outputStream = s.getOutputStream();
outputStream.write("hello".getBytes());
//释放资源
s.close();
TCP接收数据
构造方法
方法名 | 说明 |
---|---|
ServletSocket(int port) | 创建绑定到指定端口的服务器套接字 |
相关方法
方法名 | 说明 |
---|---|
Socket accept() | 监听要连接到此的套接字并接受它 |
//创建服务器端ServerSocket对象
ServerSocket ss=new ServerSocket(8888);
//监听
Socket accept = ss.accept();
//创建一个输入流对象接收数据
InputStream inputStream = accept.getInputStream();
byte[] bytes=new byte[1024];
int len=inputStream.read(bytes);
String data =new String(bytes,0,len);
System.out.println(data);
accept.close();
ss.close();
文件上传
从本地读取文件数据,发送给服务器端
服务器端接受数据后,保存到服务器本地
//客户端
//获取客户端Socket对象
Socket s = new Socket("127.0.0.1", 8888);
//从本地读取要上次的文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("JavaSE\\aa.jpg"));
OutputStream os = s.getOutputStream();
byte[] bys = new byte[1024];
int i;
while ((i = bis.read(bys)) != -1) {
// os.write(i);
os.write(bys, 0, i);
}os.flush();
//给服务器一个结束标记,标识已经传输完毕
s.shutdownOutput();//获取服务器给回的信息
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}//释放资源
bis.close();
s.close();//======================================
//服务器端
//创建服务器ServerScoket对象
ServerSocket ss = new ServerSocket(8888);
//开始监听
Socket s = ss.accept();
//接受客户端数据
InputStream is = s.getInputStream();
//创建一个字符缓冲流保存接受的数据
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("JavaSE\\bb.jpg"));
int len;
byte[] bys = new byte[1024];
while ((len = is.read(bys)) != -1) {
bos.write(bys, 0, len);
}
//告诉客户端已经接受完毕
s.shutdownInput();//给客户端返回“上传成功信息”
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bw.write("上传成功");
bw.newLine();
bw.flush();//释放资源
bos.close();
s.close();
ss.close();