TCP/IP
在Internet中TCP/IP协议是使用最为广泛的通讯协议。TCP/IP是英文Transmission
Control Protocol/Internet Protocol的缩写,意思是“传输控制协议/网际协议”。
TCP/IP实际上是一组协议,它包括上百个各种功能的协议,如:远程登录、文件传输等
,而TCP协议和IP协议是保证数据完整传输的两个基本的重要协议。通常说TCP/IP是
Internet协议族,而不单单只是指TCP协议和IP协议。
TCP/IP协议的基本传输单位是数据包(datagram)。
TCP是一种面向连接的通信协议。TCP连接提供两台计算机之间的可靠无差错的字节流数
据传输。
IP地址和端口号
IP地址:网络中每台计算机的一个标识号
是一个逻辑地址
127.0.0.1 代表本机地址
端口号:具有网络功能的应用软件的标识号
端口是一个软件结构,被客户程序或服务程序用来发送和接收数据,一台服务器有
256*256个端口。
0-1023是公认端口号,即已经公认定义或为将要公认定义的软件保留的
1024-65535是并没有公共定义的端口号,用户可以自己定义这些端口的作用。
端口与协议有关:TCP和UDP的端口互不相干
IP地址使用32位长度二进制数据表示,一般在实际中看到的大部分IP地址都是以十进制
的数据形式表示的,如:192.168.1.3。
IP地址分类:
IP地址分为5类,A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要
的人,D类用于组播,E类用于实验,各类可容纳的地址数据不同。
IP地址
NO 地址分类 地址范围
1 A类地址 1.0.0.1---126.255.255.254
2 B类地址 128.0.0.1---191.255.255.254
3 C类地址 192.0.0.1---223.255.255.254
4 D类地址 244.0.0.1---239.255.255.254
5 E类地址 240.0.0.1---255.255.255.254
在实际中可以使用127.0.0.1表示本机,或者直接使用localhost代表本机。
TCP/TP编程中,发送时,有发送类(客户端)和接受类(服务器)。
在客户端中,使用Socket进行消息的传递,Socket中带有参数(IP地址,端口号),其
中IP地址为服务器的IP地址,端口号是用户自定义的,但是端口号要在用户地址1024-
65535区域内。例如:
Socket socket = new Socket("127.0.0.1",8888)
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter
(socket.getOutputStream));
bw.writer("asfsa");
bw.flush();
socket.shutdownOutput();
服务器:
在服务器定义一个接受指定端口号的对象
ServerSocket ss = new ServerSocket(8888);
再定义一个Socket类型的变量 去接受由ServerSocket接收的指定端口号的内容。
Socket socket = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader
(socket.getInputStream));
String s="";
while((s=br.readLine())!=null){
System.out.println(s)
}
UDP
面向无连接的数据传输,不可靠,但效率高。音频,视屏、、、、
UDP一次发送的数据不能超过64kb。
UDP编程时,发送和接受仅需要两个类:
DatagramSocket-此类是用来发送和接受数据报包的套接字
DatagramPacket-此类表示数据报包,当中包含所要发送的字节数组,字节数组的长度
,目标地的IP地址,及端口号。
例如:
DatagramSocket ds = new DatagramSocket(端口号);//注:此端口号是程序的端口号
,可以不写,程序会自动补上。
InetAddress ia = InerAddress.getByName("localhost");
DatagramPacket dp = new DatagramPacket(buf,buf.length,ia,8888);
//注:buf表示所要发送的字节数组,当中包含所要发送的内容信息,ia表示目标IP地
址,8888表示端口号(这个由自己定义,但是必须符合端口号的区域要求)
//发送内容
ds.send(dp);
ds.close();//这样内容就已经给目标发送过去了,这时只要再创建一个服务器,时刻
监听端口号为8888客户端就能够接收到内容了。
//服务器
DatagramSocket ds = new DatagramSocket(8888);//注:此端口号必须写,因为这是
接收指定端口号的内容。
DatagramPacket dp = new DatagramPacket(buf,buf.length);//注:服务器端的数据报
包因为要接受指定端口号闯过来的内容,所以里面仅需一个空数组。
//接收
ds.receive(dp);//注:是把内容传递到buf中。
System.out.println(new String(buf));
Servlet
Servlet生命周期:
初始化:调用init()方法
服务:调用service()方法,会根据不同的请求执行doGet() 或者 doPost()方法,我们不需要去重写service()方法。
销毁:调用destory()方法
在Servlet,无论是在doGet() 或者是 doPost()中,都应该设置响应内容类型
response.setContentType("text/html;charset=utf-8");
防止乱码:doGet()中,应该在获取值之后,更改编码,如:
name = new String(name.getBytes("ISO-8859-1"),"UTF-8");(因为在doGet()中,直接写
request.setCharacterEncoding("UTF-8");是没有效果的,doPost()中可以这样写
)
URL:统一资源定位符
使用URL可以下载网络上的资源
URL url = new URL("地址");
HttpURLConnection
/**
* 使用HttpURLConnection及Post,get方式发送信息
* @author Administrator
*
*/
public class T_PostRUL {
public static void main(String[] args) {
/**
* 使用Post方式
*/
/*try {
//使用URL设置服务器目标
URL url = new URL(" http://127.0.0.1:8080/T_Day28/MyServletT");//MyServlet是服务器的映射
//把URL转换成HttpURLConnection类型
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置发送类型为POST
conn.setRequestMethod("POST");
//设置可写
conn.setDoOutput(true);
//获取输出流
OutputStream out = conn.getOutputStream();
out.write("username=jiansong&password=123".getBytes());
//获取输入流
InputStream is = conn.getInputStream();
//把输入流包装成字符流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//获取状态码
int code = conn.getResponseCode();
if(code == 200){
String s;
while((s = br.readLine()) != null){
System.out.println(s);
}
}else{
System.out.println("连接服务器失败,请联系管理员");
}
br.close();
is.close();
//out.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
/**
* 使用Get发送信息
*/
try {
URL url = new URL(" http://127.0.0.1:8080/T_Day28/MyServletT");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
os.write("username=jiansong&password=123".getBytes());
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
if(conn.getResponseCode() == 200){
String s;
while((s = br.readLine()) != null){
System.out.println(s);
}
}
br.close();
os.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
*
*服务器
*/
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public MyServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String name = request.getParameter("username");
String pwd = request.getParameter("password");
name = new String(name.getBytes("ISO-8859-1"),"UTF-8");
pwd = new String(pwd.getBytes("ISO-8859-1"),"UTF-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
String sql = "insert into register values('"+name+"','"+pwd+"')";
try {
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:e:\\test\\info.db");
PreparedStatement pstmt = conn.prepareStatement(sql);
int result = pstmt.executeUpdate();
if(result > 0){
pw.print("注册成功");
}else{
pw.print("注册失败");
}
pstmt.close();
conn.close();
pw.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("username");
String pwd = request.getParameter("password");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
try {
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:e:\\test\\info.db");
System.out.println("------------");
String sql = "insert into register values('"+name+"','"+pwd+"')";
PreparedStatement pstmt = conn.prepareStatement(sql);
int result = pstmt.executeUpdate();
System.out.println(sql+"-------");
if(result > 0){
out.print("注册成功");
}else{
out.print("注册失败");
}
pstmt.close();
conn.close();
out.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
HttpClient--不是JDK自带,需要导入JAR包
public class T_HttpClient {
public static void main(String[] args) {
/**
* GET下载图片
*/
/*//先创建客户端
HttpClient client = new DefaultHttpClient();
//创建发送方式
HttpGet get = new HttpGet(" http://127.0.0.1:8080/T_Day28/pic/a.jpg");
try {
HttpResponse response = client.execute(get);
int code = response.getStatusLine().getStatusCode();
HttpEntity entity = response.getEntity();
if(code == 200){
FileOutputStream fos = new FileOutputStream("e://test//ttt.jpg");
InputStream is = entity.getContent();
int len;
while((len = is.read()) != -1){
fos.write(len);
}
fos.write(EntityUtils.toByteArray(entity));
System.out.println("下载成功");
// is.close();
fos.close();
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
/**
* POST上传信息
*/
HttpClient client = new DefaultHttpClient();
//因为是上传信息给服务器,所以要加服务类的映射
HttpPost post = new HttpPost(" http://127.0.0.1:8080/T_Day28/MyServletT");
//创建参数
NameValuePair nvp1 = new BasicNameValuePair("username","pjs");
NameValuePair nvp2 = new BasicNameValuePair("password","123");
//创建List集合
List<NameValuePair> list = new ArrayList<>();
//把参数加入到集合中
list.add(nvp1);
list.add(nvp2);
try {
//把List以UTF-8的编码格式放到HttpEntity中
HttpEntity entity = new UrlEncodedFormEntity(list,"UTF-8");
//把entity加到post中去
post.setEntity(entity);
//执行post
HttpResponse response = client.execute(post);
//获取状态码
int code = response.getStatusLine().getStatusCode();
if(code ==200){
HttpEntity en = response.getEntity();//获取到的内容都在en中
System.out.println(EntityUtils.toString(en));
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}