网络编程:用Java语言实现计算机间数据的信息传递和资源共享。
网络模型:七层:(从上至下)分别是:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
网络编程的三要素:ip、端口、协议
ip:网络中计算机的唯一标识。Ip在计算机底层是由二进制所表示的,但是为了方便,人们用“点分十进制”(将二进制文件做换为十进制,再用.分开)表示IP。Ip地址的组成:网络号+主机号。如何查看自己的ip:ipconfig。如何测试IP通不通:ping
几个特殊的IP地址:127.0.0.1 回环地址(表示本机) x.x.x.255广播地址 x.x.x.0网络地址
端口:是应用程序的标识,范围为0--65535.
协议:UDP和TCP
UDP:数据打包,有限制,不连接,效率高,不可靠
TCP:建立数据通道,无限制,效率低,可靠
Socket机制:
A:通信的两端都应该有Socket对象
B:所有的通信都是通过Socket间的IO进行操作的
UDP协议发送和接收数据:
发送:创建UDP发送端的Socket对象---创建数据并把数据打包---发送数据---释放资源
接收:创建UDP接收端的Socket对象---创建数据包用于接收数据---接收数据---解析数据包---释放资源
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/*
*UDP协议发送数据
*A:创建发送端socket
*B:创建数据,并把数据打包
*C:调用Socket的方法发送数据包
*D:释放资源
*/
public class Send {
public static void main(String[] args) throws IOException {
// 创建发送端 socket
DatagramSocket ds = new DatagramSocket();
// 创建数据,并把数据打包,包的值最大64K
byte[] buf = "UDP简单应用".getBytes();
// InetAddress address=InetAddress.getByName("192.168.31.233");
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.31.233"), 12306);
// 发送数据
ds.send(dp);
// 释放资源
ds.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* UDP协议接收数据 A:创建接收端socket B:创建一个数据包(接收容器) C:调用Socket的接收方法接收数据包 D:解析数据包并显示在数据台
* E:释放资源
*/
public class Receive {
public static void main(String[] args) throws IOException {
// 创建接收端Socket对象
DatagramSocket ds = new DatagramSocket(12306);
// 创建数据包(接收容器)
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
// 调用Socket的接收方法接收数据包
ds.receive(dp);
// 解析数据包
System.out.println(
"From" + dp.getAddress().getHostAddress() + "的数据:" + new String(dp.getData(), 0, dp.getLength()));
// 释放资源
ds.close();
}
}
TCP协议发送和接收数据:
发送:创建TCP客户端的Socke对象---获取输出流,写数据---释放资源
接收:创建TCP服务器端的Socket对象---见听客户端连接---获取输入流,读数据---释放资源
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class Client {//客户端
public static void main(String[] args) throws IOException {
// 创建Socket对象
Socket s = new Socket("192.168.31.233", 2080);
// 得到输出流,进行写数据
OutputStream os = s.getOutputStream();
os.write("Is-Me-HL".getBytes());
// 释放资源
s.close();
}
}
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {//服务器端
public static void main(String[] args) throws IOException {
// 创建ServerSocket对象
ServerSocket ss = new ServerSocket(2080);
// 监听客户端,返回一个对应的Socket对象
Socket s = ss.accept();
// 得到输入流对象
InputStream is = s.getInputStream();
// 打印信息
byte[] bys = new byte[1024];
int len = is.read(bys);
String message = new String(bys, 0, len);
System.out.println(message);
// 关闭资源
ss.close();
}
}
上面是对UDP和TCP协议的简单使用做一个基础的总结,实际上我们可以结合多线程的知识,完成更为人性化,用户体验感倍增的网络程序。
注:以上文章仅是个人学习过程总结,若有不当之处,望不吝赐教。