-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
网络编程概述:
是用来实现网络中不同计算机上运行的程序间可以进行数据交换。
网络模型
网络通信的三要素
A:IP地址
网络中计算机的唯一标识。
InetAddress类(java.net包)
表示互联网协议的IP地址。
public static InetAddress getByName(String host);
在给定主机名时确定主机IP地址对象。
public String getHostName();
根据此IP地址对象获取主机名。
public String getHostAddress();
根据此IP地址对象获取IP地址。
B:端口号
正在运行的程序的标识。在创建端口号时,有效端口号为0~65535,其中0~1024为系统使用。
C:传输协议
即通信的规则,分为UDP和TCP协议。
UDP:将数据打包,大小限制在64K,不建立连接,所以速度快,但不可靠。
TCP:建立连接通道,数据不打包,大小无限制,连接速度慢,但可靠。
Socket
网络套接字,它包含了IP地址和端口。在设备之间的通信中,通信的两端都有Socket,数据在两个Socket间通过IO传递。
DatagramSocket类
UDP协议中发送和接收数据报包的套接字。
构造方法:
public DatagramSocket() throws SocketException;
public DatagramSocket(int port) throws SocketExecption;
创建数据报包套接字对象并指定端口。
成员方法:
public void send(DatagramPacket p); 发送数据报包
public void receive(DatagramPacket p); 接收数据报包
DatagramPacket类
表示数据报包
构造方法:
public DatagramPacket(byte[] buf, int length, InetAddress address, int port);
构造数据报包,将长度为length的包发送到指定主机上的指定端口号。
public DatagramPacket(byte[] buf, int length);
构造数据报包,用来接收长度为length的数据包。
成员方法:
public byte[] getData();
返回数据缓冲区。
public int getLength();
返回将要发送或接收到的数据长度。
public InetAddress getAddress();
获取IP地址
使用UDP协议制作一个发送和接收程序
<span style="font-size:14px;"><span style="font-size:14px;">//使用UDP协议发送数据,并接收 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 SendDemo2 { public static void main(String[] args) throws IOException { //创建UDP套接字对象 DatagramSocket ds = new DatagramSocket(); //创建键盘输入对象 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = null; while ((line = br.readLine()) != null) { //如果输入88,则结束发送 if (line.equals("88")) { break; } byte[] bys = line.getBytes(); //创建要发送的数据报包对象,假设端口222 DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("192.168.1.100"), 22222); //通过套接字发送数据报包 ds.send(dp); } ds.close(); } }</span></span>
<span style="font-size:14px;"><span style="font-size:14px;">//使用UDP协议接收数据 import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class ReceiveDemo2 { public static void main(String[] args) throws IOException { //创建套接字对象,并指定端口 DatagramSocket ds = new DatagramSocket(22222); while (true) { byte[] bys = new byte[1024]; //创建要接收的数据报包对象 DatagramPacket dp = new DatagramPacket(bys, bys.length); //通过套接字接收数据报包 ds.receive(dp); //输出接收的数据 System.out.println(dp.getAddress().getHostAddress() + "---" + new String(dp.getData(), 0, dp.getLength())); } } }</span></span>
Socket类
此类实现TCP协议客户端的套接字。
构造方法:
public Socket(String host,int port);
根据IP地址和端口创建客户端套接字对象。
成员方法:
public OutputStream getOutputStream();
返回此套接字的输出流。
public InputStream getInputStream();
返回此套接字的输入流。
public InetAddress getInetAddress();
返回此套接字连接的InetAddress对象。
public void shutdownOutput();
禁用此套接字的输出流,即通知服务器数据已传递完毕。
ServerSocket类
此类实现TCP协议服务器端的套接字。
构造方法:
public ServerSocket(int port);
创建一个指定端口的服务器套接字对象。
成员方法:
public Socket accept();
侦听此套接字的连接,并返回一个客户端的Socket对象。
使用TCP协议模拟上传文档
<span style="font-size:14px;">//TCP协议模拟客户端发送文档 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.net.Socket; public class ClientDemo { public static void main(String[] args) throws IOException { // 创建客户端套接字对象 Socket s = new Socket("192.168.1.101", 10086); // 封装文件 BufferedReader br = new BufferedReader( new FileReader("E:\\srcfile.txt")); // 创建通道内流 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( s.getOutputStream())); String str = null; while ((str = br.readLine()) != null) { bw.write(str); bw.newLine(); bw.flush(); } // 通知服务器,数据已经传递完毕 s.shutdownOutput(); // 读取反馈 InputStream is = s.getInputStream(); byte[] bys = new byte[1024]; int len = is.read(bys); System.out.println(new String(bys, 0, len)); br.close(); s.close(); } }</span>
<span style="font-size:14px;">//TCP协议模拟服务器端接收文档 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class ServerDemo { public static void main(String[] args) throws IOException { //创建服务器端套接字对象 ServerSocket ss = new ServerSocket(10086); //监听客户端连接 Socket s = ss.accept(); //封装通道内流 BufferedReader br = new BufferedReader(new InputStreamReader( s.getInputStream())); //封装文件 BufferedWriter bw = new BufferedWriter(new FileWriter("F:\\copy.txt")); String str = null; while ((str = br.readLine()) != null) { bw.write(str); bw.newLine(); bw.flush(); } //给出反馈 OutputStream os = s.getOutputStream(); os.write("上传成功".getBytes()); } }</span>