Java网络编程:
数据传输
协议:TCP和UDP协议
1 TCP:三次交握,面向连接,可靠传输
2 UDP:无连接,不可靠
传输:
先封装,再拆封
相关的类:
InetAddress InetSocketAddress
URL
TCP:ServerSocket Socket
UDP:DatagramSocket DatagramPacket
InetAddress 封装计算机的IP地址和DNS,没有端口
1 静态方法获取对象:
InetAddress.getLocalHost();
InetAddress.getByName(URL);
InetAddress.getByName(IP);
2 实例方法
getHostAddress() 返回IP地址
getHostName() 返回域名|本机为计算机名
InetSocketAddress 封装了计算机的IP和端口,用于socket通信
1 获取对象
InetSocketAddress(String hostName,int port)
InetSocketAddress(InetAddress address,int port)
2 实例方法
getAddress() 返回InetAddress对象
getPort() 返回端口
getHoistName() 返回域名
URL:
URI:统一资源定位符,用来唯一地标识一个资源
URL:统一资源定位器,它是一种具体的URI,统一资源定位符,由4部分组成:协议,主机,资源文件名,端口号
URL url=new URL("http://www.hello.com");
URL url=new URL(url,"world.txt");
实例方法:
getProtocol() getHost() getPort() getFile() getPath() getRef() openStream()
UDP
DatagramSocket DatagramPacket
客户端:
1 创建客户端 DatagramSocket 类
2 创建数据 字节数组
3 打包 DatagramPacket+服务器地址 端口
4 发送
5 释放资源
import java.io.IOException;
import java.net.*;
/**
* Created by lenovo on 2016/1/23.
*/
public class UDPClient {
public static void main(String[] args) throws SocketException,IOException{
DatagramSocket client=new DatagramSocket(5000);
String information="hello world";
byte[] data=information.getBytes();
DatagramPacket packet=new DatagramPacket(data, data.length, new InetSocketAddress("localhost",3000));
client.send(packet);
client.close();
}
}
服务端:
1 创建服务端 DatagramSocket 类 端口
2 准备接受容器 字节数组 封装 DatagramPacket
3 包 接收数据
4 分析
5 释放资源
package TestInternet;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* Created by lenovo on 2016/1/23.
*/
public class UDPServer {
public static void main(String[] args) throws SocketException,IOException{
DatagramSocket server=new DatagramSocket(3000);
byte[] container=new byte[1024];
DatagramPacket packet=new DatagramPacket(container,container.length);
server.receive(packet);
byte[] content=packet.getData();
String information=new String(content);
System.out.println(information);
server.close();
}
}
TCP:面向连接,安全可靠,效率低
面向连接:请求,响应
Socket编程
服务器:ServerSocket
package TestInternet;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Created by lenovo on 2016/1/23.
*/
public class TCPServer {
public static void main(String[] args) throws IOException{
ServerSocket server=new ServerSocket(3000);
Socket socket=server.accept();
System.out.println("hello");
String info="welcome";
BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bufferedWriter.write(info);
bufferedWriter.newLine();
bufferedWriter.flush();
bufferedWriter.close();
}
}
客户端:Socket
package TestInternet;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
/**
* Created by lenovo on 2016/1/23.
*/
public class TCPClient {
public static void main(String[] args) throws IOException{
Socket client=new Socket("localhost",3000);
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(client.getInputStream()));
String info=null;
while((info=bufferedReader.readLine())!=null){
System.out.println(info);
}
bufferedReader.close();
}
}
HTTP协议版本 状态代码 描述
HTTP /1.1 200 OK
HTTP 应答码也称为状态码,它反映了web服务器处理HTTP请求状态。HTTP应答码由三位数字构成,其中首位数字定义了应答码的类型
1XX:信息类,表示收到web浏览器请求,正在进一步处理中;
2XX:成功类,表示用户请求被正确接受,理解和处理
3XX:重定向类:表示请求没有成功,客户必须采取进一步动作
4XX:客户端错误,表示客户端提交的请求有错误
5XX:服务器错误,表示服务器不能完成对请求的处理
常见HTTP应答码:
200 OK
400 Bad Request
404 Not Found
405 Method Not Allowed
响应头:
一些重要的字段
Content-Length,Content-Type
响应正文:
服务器返回HTML页面,响应头与响应正文之间必须存在CRLF(\r\n)符号行,与响应头分开