网络通信三要素
1.IP地址;InetAddress
网络中的设备的标识,不易记忆,可用主机名
2.端口号
用于标识进程的逻辑地址,不同进程的标识
3.传输协议
通讯的规则
常见协议:TCP、UDP
协议:
将数据源和目的封装成数据包中,不需要建立链接;每一个数据报的大小限制在64k;因无连接,是不可靠
协议:不需要建立链接,速度快
TCP协议
建立链接,形成传输数据的通道;在链接中进行大数据传输;通过三次握手完成链接,是可靠协议;必须建立链接,效率会稍低
InetAddress:此类表示互联网协议(IP)地址(主机名和ip)
getHostAddress():返回Ip地址
getHostName():返回主机名
UDP协议发送和接收数据
使用UDP协议发送数据
创建发送端Socket对象
创建数据并打包
发送数据
释放资源
DatagramSocKet:此类表示用来发送和接收数据,基于UDP协议
DatagramSocKet():创建SocKet对象并随机分配端口号
DatagramSocKet(int port):创建SocKet对象并制定端口号
public class SendDemo {
public static void main(String[] args) throws IOException {
// 创建发送端Socket对象
DatagramSocket ds=new DatagramSocket();
// 创建数据并打包
/*DatagramPacket:此类表示数据包
数据byte[]
设备的地址ip
进程地址 端口号*/
String s="hello UDP";
byte[] bys=s.getBytes();
int length=bys.length;
InetAddress byName = InetAddress.getByName("PC-20150926YQIX");
int port=8888;
//打包
DatagramPacket dp=new DatagramPacket(bys, length, byName, port);
// 发送数据
ds.send(dp);
// 释放资源
ds.close();
}
}
使用UDP协议接收数据
创建接收端SocKet对象
接收数据
解析数据
输出数据
释放资源
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
// 创建接收端SocKet对象
DatagramSocket ds=new DatagramSocket(8888);
// 接收数据
byte[]bys=new byte[1024];
DatagramPacket dp=new DatagramPacket(bys, bys.length);
ds.receive(dp);//阻塞
// 解析数据
//InetAddress getAddress():获取发送端的Ip对象
InetAddress address = dp.getAddress();
//byte[] getDate():获取接收到的数据,也可以直接使用创建包对象时的数组
byte[] data = dp.getData();
//int getLength():获取具体收到的数据长度
int length = dp.getLength();
// 输出数据
System.out.println("send--->"+address.getHostAddress());
System.out.println(new String(data,0,length) );
// 释放资源
ds.close();
}
}
TCP协议发送和接收数据
使用TCP协议发送数据
创建发送端Socket对象(创建链接)
获取输出流对象
发送数据
释放资源
Socket(InetAddress address,int port)
public class ClientDemo {
public static void main(String[] args) throws IOException {
// 创建发送端Socket对象(创建链接)
Socket s=new Socket(InetAddress.getByName("PC-20150926YQIX"),8005);
// 获取输出流对象
OutputStream os= s.getOutputStream();
// 发送数据
String str="hello TCP";
os.write(str.getBytes());
// 释放资源
s.close();
}
}
使用TCP协议接收数据
创建接收端Socket对象
监听(阻塞)
获取输入流对象
获取数据
输出数据
释放资源
ServerSocket:接收端,服务端Socket
ServerSocket(int port)
public class ServerDemo {
public static void main(String[] args) throws IOException {
// 创建接收端Socket对象
ServerSocket ss=new ServerSocket(8005);
// 监听(阻塞)
Socket accept = ss.accept();
// 获取输入流对象
InputStream inputStream = accept.getInputStream();
// 获取数据
byte[] bys=new byte[1024];
int len;
len = inputStream.read(bys);
// 输出数据
InetAddress inetAddress = accept.getInetAddress();
System.out.println("Client--->"+inetAddress.getHostName());
System.out.println(new String(bys,0,len));
// 释放资源
inputStream.close();
}
}