网络编程
在网络通信协议下,实现网络互联的不同计算机上运行的程序间可以进行数据交换。
网络变成3要素
IP地址 计算机的标识符
端口 应用程序的标识符
协议 计算机间链接和通信的规则 UDP TCP
public class interaddress01 {
public static void main(String[] args) throws UnknownHostException {
InetAddress address=InetAddress.getByName("PCzhangshen");
String name=address.getHostName();
String ip=address.getHostAddress();
System.out.println("主机名"+name);
System.out.println("地址"+ip);
}
}
网络端口和协议
端口:设备上应用程序的唯一标识符
端口号:用来给那个字节表示,取值范围:0-65535之间,其中0-1023用于一些知名的网络服务和应用,普通的要用1024以上的端口号,如果端口号被一个服务所占用,则会导致当前的应用程序启动失败。
协议:计算机网络中链接和 通信的规则被称为网络通信协议
UDP:无连接协议,数据在传输时不建立逻辑链接,数据是否接受不会受到反馈
消耗资源少,通信效率高,通常用于音频视频和普通数据的传输
但是由于无连接性,不能保证数据完整性,重要数据不建议使用UDP传输。
TCP协议:
面向链接的通信协议,必须要明确客户端和服务器端,每次链接都需要3次握手,
第一次握手:客户端向服务器发送链接请求
二:服务器向客户端会送一个相应
三:客户端发送确认信息,确认链接
三次握手,建立链接之后,客户端和服务器就开始进行数据传输了,保证数据传输的安全性
,用于,上传文件,下载文件,浏览网页。
UDP通信原理
创建发送端的socket对象
创建数据,并且打包
调用DatagamSocket对象的方法发送数据。
import java.io.IOException;
import java.net.*;
public class udpsend01 {
public static void main(String[] args) throws IOException {
//发送数据需要四部
DatagramSocket ds=new DatagramSocket();
byte[] bys="hello,udp".getBytes();
int length=bys.length;
InetAddress address=InetAddress.getByName("192.168.1.105");
int port=10086;
DatagramPacket dp=new DatagramPacket(bys,length,address,port);
ds.send(dp);
ds.close();
}
}
UDP接收数据
创建接收端的Socket对象
创建数据包,用于接收数据
调用DatagramSocket对象的方法接收数据
解析数据包,并把数据包在控制台显示
关闭接收端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class updresiver01 {
public static void main(String[] args) throws IOException {
DatagramSocket ds=new DatagramSocket(10086);
byte[] bys=new byte[1024];
DatagramPacket dp=new DatagramPacket(bys,bys.length);
ds.receive(dp);
byte[] datas=dp.getData();
int len=dp.getLength();
String datastring=new String(datas,0,len);
//这里是把转换成字符串
System.out.println("数据是:"+datastring);
ds.close();
}
}
改进版:886关闭
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class updresiver02 {
public static void main(String[] args) throws IOException {
DatagramSocket ds=new DatagramSocket(10086);
while(true) {
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
ds.receive(dp);
byte[] datas = dp.getData();
int len = dp.getLength();
String datastring = new String(datas, 0, len);
//这里是把转换成字符串
System.out.println("数据是:" + datastring);
}
}
}
package com.it05;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class udpsend02 {
public static void main(String[] args) throws IOException {
//发送数据需要四部
DatagramSocket ds=new DatagramSocket();
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line;
while((line=br.readLine())!=null) {
if ("886".equals(line)) {
break;
}
byte[] bys = line.getBytes();
int length = bys.length;
InetAddress address = InetAddress.getByName("192.168.1.105");
int port = 10086;
DatagramPacket dp = new DatagramPacket(bys, length, address, port);
ds.send(dp);
}
ds.close();
}
}
TCP通信程序
TCP通信协议是一种可靠的网络协议,他在通信的两端各自建立一个Socket对象,从而在通信的两端形成虚拟网络链路,一旦建立了虚拟网络链路,两端死亡程序就可以通过虚拟链路进行通信,
Java对基于TCP协议的网络提供了良好的封装,使用socket对象来代表两端的通信端口,并通过socket产生IO流进行通信
Java为客户端提供了socket类,为服务器端提供了serversocket类
发送数据的步骤:
创建客户端的socket对象
获取输出流,写数据
释放资源
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.logging.SocketHandler;
public class tcpsend01 {
public static void main(String[] args) throws IOException {
Socket s=new Socket("192.168.1.105",10000);
OutputStream os=s.getOutputStream();
os.write("hello tcp,我老了".getBytes());
s.close();
}
}
348;;tcp接收数据
创建服务器端的socket对象sercersocket
先监听
获取输入流,读数据,并且把数据显示在控制台
释放资源
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class tcpsresiver01 {
public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(10000);
Socket s=ss.accept();
InputStream is=s.getInputStream();
byte[] bys=new byte[1024];
int len=is.read(bys);
String data=new String(bys,0,len);
System.out.println("数据是"+data);
s.close();
ss.close();
}
}