1.网络编程基础知识:
网络编程是直接或间接通过网络协议与其他计算机进行通讯。
网络编程中有两个问题:如何精准找到网络上要通讯的主机;在找到主机后如何进行数据传输。
在TCP/IP协议中,IP层主要负责网络主机的定位,数据传输的路由,由IP地址唯一确定网络上的一台主机;
而TCP层则提供面向应用的可靠或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层如何处理数据。
2.传输协议:TCP/UDP
尽管TCP/IP协议中名称只有TCP这个协议名,但是在TCP/IP的传输层同时存在TCP和UDP这两个协议。
在建立连接后,可以进行大数据量的传输。通过TCP协议传输时,发送方和接收方的成对的两个
socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个Socket(通常是Server Socket)
等待连接时,另一个Socket可以要求连接,一旦这两个Socket连接起来,它们就可以进行双向数据传输,
双方都可以进行数据的发送和接收操作。这种通讯和我们日常生活中打电话通讯十分类似。
UDP(User Datagram Protocol):是一种面向无连接的传输协议,这种通讯和我们日常生活中邮寄信件非常类似,
将数据、数据源以及目的地封装成数据包中进行传输,由于不需要建立连接,所以传输效率会稍微高点,
但是无法保证数据包会一定到达目的地、数据的可靠性、以及时间上的次序,是一种不可靠的协议。
使用UDP传输数据时是有大小限制的,每个数据包的大小限制在64k内。
3.java网络编程
java中的网络编程其实就是指Socket编程,Socket是为网络服务提供的一种机制,在通信两端都有Socket,数据在两个Socket间进行IO传输。
3.1. IP地址:IP地址是网络中设备的标识,用来定位网络主机,在java中IP地址被封装成InetAddress对象。
static InetAddress[] getAllByName(String host); 在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
static InetAddress getByAddress(byte[] addr); 在给定原始 IP 地址的情况下,返回 InetAddress 对象。
static InetAddress getByAddress(String host ,byte[] addr); 根据提供的主机名和 IP 地址创建 InetAddress
static InetAddress getByName(String host); 在给定原始 IP 地址的情况下,返回 InetAddress 对象。
static InetAddress getLocalHost(); 返回本地主机
String getHostAddress(); 返回 IP 地址字符串(以文本表现形式)
String getHostName(); 获取此 IP 地址的主机名
byte[] getAddress(); 返回此 InetAddress 对象的原始 IP 地址
3.2. 使用UDP建立Socket服务进行传输数据
1)使用到的对象:
DatagramSocket: 用来发送和接收数据报包的套接字
DatagramPacket: 数据报包
使用UDP协议发送数据:
步骤:a.建立UDPSocket服务;
b.提供数据,并将数据封装到数据报中;
c.通过Socket服务的发送功能,将数据报发送出去;
d.关闭资源;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UdpSendDemo{
public static void main(String[] args) throws Exception {
//1.创建UDP服务,端口号有系统指定
DatagramSocket ds = new DatagramSocket();
//2.确定数据,并封装成数据报,将数据发送到本机,用端口号10000处理
byte[] buf = "使用UDP发送数据".getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length ,InetAddress.getLocalHost() , 10000);
//3.使用socket服务将数据报发送出去
ds.send(dp);
//4.关闭资源
ds.close();
}
}
使用UDP协议接收数据
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReceiveDemo {
public static void main(String[] args)throws Exception {
//1.创建UDP服务,监听端口号10000
DatagramSocket ds = new DatagramSocket(10000);
//2.创建接收数据的数据报
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
//3.通过socket服务接收数据存入定义好的数据报中,receive()方法是阻塞式的
ds.receive(dp);
//4.通过数据报获取数据
System.out.println("IP: " + dp.getAddress().getHostAddress() + " 端口号 "
+ dp.getPort() + " 内容: " + new String(dp.getData()).trim());
//5.关闭资源
ds.close();
}
}
3.3使用TCP传输数据:
1).使用到的对象:
Socket: 实现客户端套接字
ServerSocket: 实现客户端套接字
//客户端代码
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class TcpClientDemo {
public static void main(String[] args)throws Exception {
//1.创建Socket服务,并指定要连接的地址和端口
Socket socket = new Socket(InetAddress.getLocalHost() , 10000);
//2.获取输入流,写入数据,发送到服务端
OutputStream os = socket.getOutputStream();
os.write("Socket客户端使用Tcp发送数据".getBytes());
//3.获取输出流,读取服务端发送过来的数据
InputStream is = socket.getInputStream();
byte[] buf = new byte[1024];
int len = is.read(buf);
System.out.println(new String(buf ,0 , len));
//4.关闭资源
socket.close();
}
}
//服务端代码
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServerDemo {
public static void main(String[] args) throws Exception{
//1.建立服务端socket
ServerSocket ss = new ServerSocket(10000);
//2.接收客户端Socket, 该方法是阻塞式的
Socket s = ss.accept();
//3.读取客户端发送的数据
InputStream is = s.getInputStream();
byte[] buf = new byte[1024];
int len = is.read(buf);
System.out.println(new String(buf,0 , len));
//4.给客户端发送数据
OutputStream os = s.getOutputStream();
os.write("服务端发送数据到客户端".getBytes());
//5.关闭服务
s.close();
ss.close();
}
}
4.基于URL高层次的Java网络编程
URL代表统一资源定位符,它表示Internet上某一资源的地址。
使用URL连接网络上的资源
URL url = new URL("http://www.baidu.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET"); // 设置请求方式为get方式
conn.setReadTimeout(5000); //设置读取时间为5s
conn.setConnectTimeout(5000); //设置连接超时时间
conn.connect(); // 开始连接
if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){ // 根据返回码判断是否连接成功
byte[] buf = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
InputStream in = conn.getInputStream();
while((len= in.read(buf)) != -1){
bos.write(buf , 0 , len);
}
System.out.println(bos.toString());
bos.close();
}
conn.disconnect(); //断开连接
参考博客:http://www.cnblogs.com/linjiqin/archive/2011/06/10/2077237.html