网络编程就是:实现网络互联的不同计算机上运行的程序间可以进行数据交换
网络模型:网络间通信的规则
1、OSI参考模型
2、TCP/IP参考模型
image.png
网络编程三要素:ip地址,端口,协议。
InetAddress类
java为了更方便的操作ip地址,提供了InetAddress类。
协议:通信的规则
1、UDP协议
把数据打包,数据有限制(64K),不建立连接,速度快,不可靠。
2、TCP协议
建立连接,形成传输数据的通道,在连接的过程中进行大数据量的传输,通过三次握手完成连接,是可靠协议,必须建立连接,效率稍低。
Socket
Socket:包含了IP地址和端口号
原理:
1、通信两端都有socket
2、网络通信其实就是socket间的通信
3、数据在两个socket间通过IO传输
/**
* UDP协议发送Demo
*/
public class Demo {
public static void main(String[] args) throws Exception {
// 1、创建UDP协议Socket对象
DatagramSocket ds=new DatagramSocket();
// 2、数据打包
byte[] by="hello,UDP协议".getBytes();
InetAddress address=InetAddress.getByName("192.168.24.28");
DatagramPacket dp=new DatagramPacket(by, by.length, address, 10086);
// 3、发送数据
ds.send(dp);
// 4、释放资源
ds.close();
}
}
/**
* UDP协议接收demo
*
*/
public class Demo1 {
public static void main(String[] args) throws Exception {
//创建对象
DatagramSocket ds = new DatagramSocket(10086);
byte[] bytes=new byte[1024];
DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
// 接收数据包
ds.receive(dp);
// 解析数据包
byte[] data=dp.getData();
System.out.println(new String(data,0,dp.getLength()));
// 释放资源
ds.close();
}
}
注意:需要先运行接收端,再运行发送端。
/**
* TCP协议发送Demo(客户端)
*/
public class Demo {
public static void main(String[] args) throws Exception {
// 1、创建Socket对象
Socket socket = new Socket("192.168.24.28", 10086);
// 2、获取输出流,写数据
OutputStream out = socket.getOutputStream();
out.write("你好 TCP!".getBytes());
//3、获取输入流(接收服务端响应)
InputStream is = socket.getInputStream();
// 释放资源
byte[] bytes = new byte[1024];
int len = is.read(bytes);
System.out.println(new String(bytes, 0, len));
// 4、释放资源
out.close();
socket.close();
}
}
/**
* TCP协议接收demo
*
*/
public class Demo1 {
public static void main(String[] args) throws Exception {
// 创建服务端Socket对象
ServerSocket serverSocket = new ServerSocket(10086);
// 监听客户端连接,并返回Socket对象
Socket socket = serverSocket.accept();
// 获取输出流
InputStream is = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = is.read(bytes);
System.out.println(new String(bytes, 0, len));
// 返回响应
OutputStream out=socket.getOutputStream();
out.write("收到了!".getBytes());
// 释放资源
is.close();
out.close();
socket.close();
// 服务端不要关闭
}
}
多线程更改代码
/**
* TCP协议发送Demo(客户端)
*/
public class Demo {
public static void main(String[] args) throws Exception {
// 1、创建Socket对象
Socket socket = new Socket("192.168.24.28", 10086);
// 2、获取输出流,写数据
OutputStream out = socket.getOutputStream();
out.write("你好 TCP!".getBytes());
//3、获取输入流(接收服务端响应)
InputStream is = socket.getInputStream();
// 释放资源
byte[] bytes = new byte[1024];
int len = is.read(bytes);
System.out.println(new String(bytes, 0, len));
// 4、释放资源
out.close();
socket.close();
}
}
/**
* TCP协议接收demo
*
*/
public class Demo1 {
public static void main(String[] args) throws Exception {
// 创建服务端Socket对象
ServerSocket serverSocket = new ServerSocket(10086);
while(true) {
// 监听客户端连接,并返回Socket对象
Socket socket = serverSocket.accept();
new Thread(new GetThread(socket)).start();
}
}
}
public class GetThread implements Runnable {
private Socket socket;
public GetThread(Socket socket) {
this.socket=socket;
}
@Override
public void run() {
// 获取输出流
InputStream is = null;
OutputStream out = null;
try {
is = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = is.read(bytes);
System.out.println(new String(bytes, 0, len));
// 返回响应
out=socket.getOutputStream();
out.write("收到了!".getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
// 释放资源
try {
if(is!=null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(out!=null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(socket!=null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
// 服务端不要关闭
}
}
}
网友评论