目录
1.网络编程概述
1.网络编程的目的
2.网络编程的三个问题
1.如何准确定位网络上的主机?
2.如何定位主机上的特定应用?
3.找到主机后如何可靠高效的进行数据传输?
2.通信要素一:IP和端口号
1.IP地址
2.端口号
3.套接字
4.通信要素二:网络协议
1.使用TCP协议通信
1.客户端
2.服务器端
5.URL编程:统一资源定位符
1.网络编程概述
1.网络编程的目的
直接或间接的通过网络协议和其他计算机实现数据交换,进行通讯。
2.网络编程的三个问题
1.如何准确定位网络上的主机?
主机:IP地址来确定
2.如何定位主机上的特定应用?
应用:端口号来确定
3.找到主机后如何可靠高效的进行数据传输?
通过网络通信协议:TCP/IP协议
2.通信要素一:IP和端口号
1.IP地址
1.IP地址:inetAddress;唯一的表示Internet上的计算机;
2.IPV4:由4个字节组成,0-255;已经用尽
IPV6:由16个字节组成,写成8个无符号整数;更适合如今使用
3.DNS:域名解析服务器
4.一般访问网络不会去记IP地址:192.168.1.1;而是通过域名:比如:www.mi.com等来访问,然后经过DNS解析域名在网络服务器上找到相应资源。
5.本地回路地址:127.0.0.1;对应:localhost
6.实例化方法:
getByName(String host)
getLocalHost():获取本地地址
getHostName():获取主机域名
getHostAddress:获取主机IP地址
@Test
public void test() throws UnknownHostException {
InetAddress ia = InetAddress.getByName("127.0.0.1");
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(ia.getHostAddress());
System.out.println(ia.getHostName());
System.out.println(localHost.getHostName());
System.out.println(localHost.getHostAddress());
}
2.端口号
1.端口号概述:规定为16位整数:0-65535
作用:唯一标识正在计算机上运行的进程
2.端口分类:
公认端口:0-1023;被预先定义的服务通信占用。
注册端口:1024-49151;分配给用户进程或应用程序
动态/私有端口:49152-65535
3.套接字
端口号和IP地址的组合得出一个网络套接字:Socket;因此可以直接使用Socket来通信,其中已经包含了IP地址和端口号。
4.通信要素二:网络协议
1.使用TCP协议通信
1.客户端
1.创建Socket对象,指明服务器端IP和端口号
2.获取一个输出流,用于输出数据
3.写出数据的操作
4.资源关闭
//客户端
@Test
public void test1() throws IOException {
//1.造socket对象,指明IP地址和端口号
Socket socket = new Socket("127.0.0.1", 8899);
//2.获取输出流,输出数据
OutputStream os = socket.getOutputStream();
//3.写出数据
FileInputStream fi = new FileInputStream("hello.txt");
byte[] buffer = new byte[1024];
int len;
while((len = fi.read(buffer)) != -1){
os.write(buffer,0,len);
}
//read()不会主动关闭数据输出,而是继续等待传输数据,因此主动关闭数据的输出
socket.shutdownOutput();
//接受来自服务器的数据
InputStream is = socket.getInputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer1 = new byte[1024];
int len1;
while((len1 = is.read(buffer1)) != -1){
bos.write(buffer1,0,len1);
}
System.out.println(bos.toString());
//4.关闭流
fi.close();
os.close();
socket.close();
}
2.服务器端
1.创建服务器端ServerSocket,指明自己的端口号;IP地址默认为服务器地址
2.调用accept()方法接收来自于客户端的socket
3.获取输入流
4.读取输入流中的数据
5.关闭资源
//服务器端
@Test
public void test2() throws IOException {
//1.创建服务器端ServerSocket,指明自己的端口号;IP地址默认为服务器地址
ServerSocket ss = new ServerSocket(8899);
//2.调用accept()方法接收来自于客户端的socket
Socket soc = ss.accept();
//3.获取输入流
InputStream is = soc.getInputStream();
//4.读取输入流中的数据
FileOutputStream fos = new FileOutputStream("hello2.txt");
byte[] buffer = new byte[1024];
int len;
while((len = is.read(buffer)) != -1){
fos.write(buffer,0,len);
}
//返回“发送成功”给客户端
OutputStream os = soc.getOutputStream();
os.write("已经收到文件了!".getBytes());
//5.关闭资源
fos.close();
is.close();
soc.close();
ss.close();
}
5.URL编程:统一资源定位符
1.标识Internet上某一资源的地址
2.URL包含五部分:
3.URL方法和编程
public static void main(String[] args) throws MalformedURLException {
URL url = new URL("http://localhost:8899/day36/hello.txt");
System.out.println(url.getFile());
}