[课堂笔记]JAVA-网络编程
数据传输
1、传输的数据格式2、用socket方式来吧相应格式的数据从机器A传到机器B
多机版
《计算机导论》
计算机组成、原理、多媒体、网络、软件系统、硬件系统
网络协议:计算机-计算机进行通信对话的标准语言
TCP/IP协议
网络编程两种方式
URL类方式:
借助Socket
方法1:HTTP协议访问WEB(WWW网页)资源
https:// 加密,安全
URL:Uniform Resoure Locator(完整的网络地址)
访问WEB服务器上的资源
URL类
URL url = new URL("http://www.baidu.com");
方法 getProtocol() 获取URL对象的协议名
getHost() 获取URL对象的主机名
getPort() 获取URL对象的端口号,若没有设置端口,则返回-1
端口port:计算机进行网络通信,必须要打开一扇门,每一扇门赋予的一个编号就是端口。
URL 只能读,不能写
URLConnector 既要读,也要写
public URLConnector openConnector() throws IPException
public final InputStream openStream() throws IPException
import java.io.*;
import java.net.URL;
public class Test {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
URL usst = new URL("http://www.usst.edu.com/");
InputStream in = usst.openStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in,"utf-8"));
String str;
while ((str = br.readLine()) != null)
System.out.println(str);
in.close();
}
}
练习1:做一个小爬虫demo,把上海理工大学新闻的标题全部爬取出来
import java.io.*;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
for(int i = 378;i>=300;i--)
{
URL usst = new URL("http://www.usst.edu.cn/s/1/t/517/p/2/i/"+i+"/list.htm");
InputStream in = usst.openStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8"));
String str;
while ((str = br.readLine()) != null) {
Pattern p = Pattern.compile("<font color=''>(.+?)</font>");
Matcher m = p.matcher(str);
while (m.find()) {
System.out.println(m.group(1));
}
}
in.close();
}
}
}
方法2:底层的网络协议TCP/UDP协议进行网络资源的通信。本课程要求会TCP协议
套路模仿
如何封装自己的网络通信数据包格式
TCP协议:Transfer Control Portocol
面向连接,可靠的传输,慢
UDP协议:User Datagram Portocol
面向无连接,不可靠的传输
server:接受连接,被动等待。打开端口监听(listening),等待客户连接。
client:主动连接对方打开的端口。
端口是一个整数(1-1024)系统会占用
一般自定义端口的数字都比较大
accept是一个阻塞操作,没有执行完,会停止并等待,不会继续往下面运行。
(非阻塞操作:Thread.start())
127.0.0.1地址:代表的是本机回环loopback地址
练习2:完成聊天程序,两个人两台机器来测试(要修改监听的地址)
import java.io.*;
import java.net.*;
public class Server {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
//服务器端
ServerSocket server;
server = new ServerSocket(9999);
//套接字,接受客户端连接,实现TCP/UDP协议通信的基本
Socket client;
client=server.accept();//服务器创建一个套接字接受连接
//accept是一个阻塞操作
//一旦有客户端连接上,继续进行下面的语句,开始数据的传输
BufferedReader is = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter os = new PrintWriter(client.getOutputStream());
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("client发送的消息:"+is.readLine());
String inputString = sin.readLine();
while(inputString!=null && !inputString.equals("quit"))
{
os.println(inputString);//将数据准备(缓冲器)发送到客户端
os.flush();//发送
System.out.println("server发送的信息:"+inputString);
System.out.println("client发送的消息:"+is.readLine());
inputString = sin.readLine();
}
is.close();
os.close();
client.close();
server.close();
System.out.println("over");
}
}
import java.io.*;
import java.net.*;
public class Client {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
Socket server = new Socket("127.0.0.1",9999);
System.out.println("请输入信息:");
//127.0.0.1地址:代表的是本机回环loopback地址
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
PrintWriter os = new PrintWriter(server.getOutputStream());
BufferedReader is = new BufferedReader(new InputStreamReader(server.getInputStream()));
String inputString = sin.readLine();
while(inputString!=null && !inputString.equals("quit"))
{
os.println(inputString);
os.flush();//发送
System.out.println("client发送的信息:"+inputString);
System.out.println("server发送的消息:"+is.readLine());
inputString = sin.readLine();
}
os.close();
is.close();
server.close();
System.out.println("over");
}
}
网络通信:多线程
p267 例11-4