黑马程序员--网络编程

------- android培训、java培训、期待与您交流! ----------


网络编程概述:

                   网络编程是指编写与其它计算机进行通信的程序。Java已经将网络程序所需要的东西封装成不同的类。

  只要创建这些类的对象,使用相应的方法,即使设计人员不具备有关的网络知识,也可以编写出高质量的网络通信程序。

 

1.网络模型

(1)OSI参考模型(2)TCP/IP参考模型

黑马程序员--网络编程_第1张图片

2.网络通讯要素

           (1)IP地址(InetAddress已经封装成了对象)

1、网络中设备的标识
2、不易记忆,可用主机名
3、本地IP地址:127.0.0.1 主机名:Localhost。

           (2)端口号(数字标识,没有必要封装成对象)

1、用于标识进程的逻辑地址,不同进程的标识。
2、有效端口:0~65535,其中0~1024系统使用或保留端口。

           (3)传输协议
                    1、通讯的规则。
                    2、常见协议:TCP,UDP。

网络编程-IP地址

由于IP地址是一个复杂的事物,Java已经将它封装成了对象。

类 InetAddress


static InetAddress getLocalHost()
          返回本地主机。

 String getHostAddress()
          返回 IP 地址字符串(以文本表现形式)。
 String getHostName()
          获取此 IP 地址的主机名。

static InetAddress getByName(String host)
          在给定主机名的情况下确定主机的 IP 地址。


import java.net.InetAddress;
public class  Test{
public static void main(String... args) throws Exception{ 
InetAddress i = InetAddress.getLocalHost(); 
String ip = i.getHostAddress(); 
String hostName = i.getHostName(); 
System.out.println("IP地址"+ip); 
System.out.println("主机名"+hostName); 
InetAddress inetAddress = InetAddress.getByName("www.baidu.com"); 
System.out.println(inetAddress.getHostAddress()); 
System.out.println(inetAddress.getHostName()); 

网络编程-UDP-TCP

UDP 特点:(面向无连接)

1、将数据及源和目的封装在数据包中,不需要建立连接。(封包,无连接)
2、每个数据包的大小限制在64k内。(小数据)
3、因无连接,是不可靠协议。(不可靠,丢数据)
4、不需要建立连接,速度快。(速度快)

TCP 特点:(面向连接)

1、建立连接,形成传输数据的通道。(连接)
2、在连接中进行大数据量传输。(大数据)
3、通过三次捂手完成连接,是可靠协议。(可靠)
4、必须建立连接,效率会稍低。(速度慢)

网络编程-Socket(Socket也称套接字)

1、Socket就是为网络通信提供的一种机制。
2、通信的两端都有Socket
3、网络通信其实就是Socket间的通信。
4、数据在两个Socket间通过IO传输。

网络编程-UDP传输(应用小程序 )

/*
需求:
通过udp传输方式,将一段文字数据发送出去。

思路:1.建立udpSocket服务。

           2.提供数据,并将数据封装到数据包中。

           3.通过Socket服务的发送功能,将数据包发送出去。

          4.关闭资源。

*/

import java.net.InetAddress;
import java.net.DatagramSocket;
import java.net.DatagramPacket;
class UdpSend{
public static void main(String...args)throws Exception{ 
//1.创建udp服务,通过DatagramSocket对象。 
DatagramSocket ds =new DatagramSocket (888); 
//2.确定数据,并封装成数据包。 
//DatagramPacket(byte[] buf, int length, InetAddress address, int port)  
byte[] buf ="黑马程序员".getBytes(); 
DatagramPacket dp =  new DatagramPacket( 
                       buf, 
                       buf.length, 
                       InetAddress.getByName("192.168.9.101"), 10000); 
//3.通过socket服务,将已有的数据包发送出去,通过Send方法。 
ds.send(dp); 
//4.关闭资源。 
ds.close(); 
} 
}
/*
需求: 定义一个应用程序,用于接收udp协议传输的数据并处理。 
思路:1.建立udpSocket服务。 
     2.建立一个数据包,用于存储监听到的端口的数据。 
       把接收到的数据封装的数据包,就可以操作数据包对象, 
       使用其更多的功能对接收到的数据进行更多的操作。 
     3.通过Socket服务的监听功能,将接收到的数据存入到已经定义好的数据包中。 
     4.通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上。 
     5.关闭资源。 
*/
class UdpRece{
public static void main(String...args) throws Exception{ 
//1.创建udp的Socket服务,建立端点。 
DatagramSocket ds =new DatagramSocket(10000); 
//2.预定义数据包,用于存储接收数据。 
byte[] buf =new byte[1024]; 
DatagramPacket dp = new DatagramPacket(buf,buf.length); 
//3.通过服务的receive方法,将收到的数据存入到定义好的数据包中。 
ds.receive(dp); 
//4.通过数据包中的方法获取其中的数据。 
String ip = dp.getAddress().getHostAddress(); 
int port = dp.getPort(); 
String data = new String(dp.getData(),0,dp.getLength()); 
System.out.println("IP地址:"+ip+"..."+data+"...端口:"+port); 
//5.关闭资源。 
ds.close(); 
} 
}

网络编程-TCP传输

1、Socket和ServerSocket。

2、建立客户端和服务器端。

3、建立连接后,通过Socket中的IO流进行数据的传输。

4、关闭Socket。

网络通讯——Tcp服务端客户端互动

import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.ServerSocket;
/*
思路:


1.创建客户端服务。并指定需要连接的主机与端口。 

2.获取客户端中的输出流,将数据写入流中。 

3.获取客户端中的输入流,将服务端反馈的数据进行读取。 

4.关闭资源。 

*/
class Cilent{


public static void main(String...args) throws Exception{ 

Socket s = new Socket("127.0.0.1",10000); 

OutputStream out = s.getOutputStream(); 

out.write("服务端你好".getBytes()); 

InputStream in = s.getInputStream(); 

byte[]buf =new byte[1024]; 

int len = in.read(buf); 

System.out.println(new String(buf,0,len)); 

s.close(); 

} 

}
/*
思路:


1.建立服务端服务。并监听一个端口。 

2.获取连接进来的客户端对象。 

3.获取客户端的读取流,读取客户端流中的数据。 

4.给客户端回馈一个信息,获取客户端中的输入流,将数据写入流中。 

5.关闭连接进来的客户端对象。 

6.关闭客户资源(必选)关闭服务端资源(可选) 

*/
class Server{


public static void main(String...args) throws Exception{ 

ServerSocket ss = new ServerSocket(10000); 

Socket s = ss.accept(); 

String ip = s.getInetAddress().getHostAddress(); 

System.out.println(ip+"...连接成功"); 

InputStream in = s.getInputStream(); 

byte[] buf = new byte[1024]; 

int len = in.read(buf); 

System.out.println(new String(buf,0,len)); 

OutputStream out = s.getOutputStream(); 

Thread.sleep(10000); 

out.write("客户端你也好".getBytes()); 

s.close();//必需的 

ss.close();//可选 

} 

}


网络编程——上传文本

/*
需求:
将客户端的一个文本文件上传到服务端去.

客户端:


1.建立客户端服务,并指定一个主机和端口。 

2.获取客户端的输出流对象,把数据写入流中。 

3.获取客户端的输入流,读取服务端的反馈信息。 

4.关闭资源。 

*/
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.InputStreamReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.net.Socket;
import java.net.ServerSocket;
class TextClient{


public static void main(String...args) throws Exception{ 

Socket s = new Socket("127.0.0.1",10000); 

BufferedReader bufr =  

new BufferedReader(new FileReader("C:\\1.txt")); 

PrintWriter out = new PrintWriter(s.getOutputStream(),true); 

String line =null; 

while((line=bufr.readLine())!=null){ 

out.println(line); 

} 

s.shutdownOutput();//原理其实就是-1 

BufferedReader in =  

new BufferedReader(new InputStreamReader(s.getInputStream())); 

String len =null; 

while((len=in.readLine())!=null){ 

System.out.println(len); 

} 

bufr.close(); 

s.close(); 

} 

}
/*
服务端:


1.建立服务端服务,并监听一个端口。 

2.获取客户端对象。 

3.获取客户端输入流,将数据读取出来,并写入一个文件中,存入在D盘。 

4.获取客户端的输出流,给客户端回馈点信息。 

5.关闭资源。 

*/
class TextServer{


public static void main(String...args)throws Exception{ 

ServerSocket ss = new ServerSocket(10000); 

Socket s = ss.accept(); 

String ip = s.getInetAddress().getHostAddress(); 

System.out.println(ip+"....连接成功"); 

PrintWriter pw =new PrintWriter(new FileWriter("D:\\1.txt"),true); 

BufferedReader in = 

new BufferedReader(new InputStreamReader(s.getInputStream())); 

String line = null; 

while((line=in.readLine())!=null){ 

pw.println(line); 

} 

PrintWriter out =new PrintWriter(s.getOutputStream(),true); 

out.println("上传成功"); 

pw.close(); 

s.close(); 

ss.close(); 

} 

}


网络编程——上传图片文件

/*
需求:


将客户端的图片文件上传到服务端去。(并考虑多个用户同时操作的情况) 


客户端


1.创建客户端服务。并指定主机和端口。 

2.读硬盘上的图片文件。 

3.获取客户端的输出流,将图片文件写出去。 

4.定义上传结束标记。 

5.服务端给客户端反馈一个结果。 

6.关闭流资源。关闭客户端资源。关闭服务端资源。 

*/ 

import java.io.FileInputStream; 

import java.io.FileOutputStream; 

import java.io.InputStream; 

import java.io.OutputStream; 

import java.io.File; 

import java.net.Socket; 

import java.net.ServerSocket; 

class PicClient{


public static void main(String...args) throws Exception{ 

if(args.length!=1){


System.out.println("请选择一个jpg文件"); 

return; 

}


File file = new File(args[0]);


if(!file.getName().endsWith(".jpg")){


System.out.println("文件格式错误,不是jpg"); 

return ; 

} 

if(!(file.exists() && file.isFile())){


System.out.println("该文件有问题,要么不存在,要么不是文件"); 

return ; 

}


if(file.length()>1024*1024*5){


System.out.println("文件过大,无法处理"); 

return ; 

}


Socket s = new Socket("127.0.0.1",10000); 

FileInputStream fis = new FileInputStream(file); 

OutputStream out = s.getOutputStream(); 

byte[]bufout = new byte[1024]; 

int by = 0; 

while((by=fis.read(bufout))!=-1){ 

out.write(bufout,0,by); 

} 

s.shutdownOutput(); 

InputStream in = s.getInputStream(); 

byte[] bufin =new byte[1024]; 

int len = in.read(bufin); 

System.out.println(new String(bufin,0,len)); 

fis.close(); 

s.close(); 

} 

}
/*
服务端:
1.创建服务端服务,并监听一个端口。
2.获取客户端对象。
3.获取客户端的输入流,将传输的数据存储到硬盘中。
4.存储成功则给客户端回馈上传成功,否则上传失败。
5.关闭流资源。关闭客户端资源。关闭服务端资源。
*/ 

class PicThread implements Runnable{ 

private Socket s; 

PicThread(Socket s){ 

this.s=s; 

} 

public void run(){ 

String ip = s.getInetAddress().getHostAddress();
int count = 1;


try{ 

System.out.println(ip+"...连接进来了");
File file = new File("D:\\Pic\\"+ip+"("+(count)+").jpg");
while(file.exists()) 

file = new File("D:\\Pic\\"+ip+"("+(count++)+").jpg"); 

FileOutputStream fos = new FileOutputStream(file); 
InputStream in = s.getInputStream(); 
byte [] buf =new byte[1024]; 
int by = 0; 
while((by=in.read(buf))!=-1){ 
fos.write(buf,0,by); 
} 

OutputStream out = s.getOutputStream(); 

out.write("上传成功".getBytes()); 

fos.close(); 

s.close(); 

} 

catch(Exception e){ 

throw new RuntimeException("图片上传失败"); 


} 

} 
}
class PicServer{

public static void main(String...args) throws Exception{ 

ServerSocket ss = new ServerSocket(10000); 

while(true){ 

Socket s = ss.accept(); 

new Thread(new PicThread(s)).start(); 

} 

} 

} 

网络编程——域名解析


黑马程序员--网络编程_第2张图片









你可能感兴趣的:(JAVA)