黑马程序员——网络编程篇

来源:互联网 发布:hspa 什么网络 编辑:程序博客网 时间:2024/06/15 08:18
------- android培训、java培训、期待与您交流! ----------

概述

    网络编程最主要的工作是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析。

    从而提取出对应的信息,达到通信的目的。

网络编程三要素

1.IP地址

    ①.IP的中文简称为“网协”,也就是为计算机网络相互连接经行通信而设计的协议。

    ②.它代表计算机在网络中的唯一标识。具有唯一性。

    ③.IP地址是一个32位或者128位的无符号数字,使用4组数字表示一个固定的编号,数字之间用点号隔开。

    ④.DOS命令:ipconfig—查看本机ip,ping后面跟IP地址——测试通信。

    ⑤.IP地址的对象类为InetAddress类。

2.端口

    ①.端口是应用程序的标识。

    ②.范围0—65535,其中0—1024为系统使用或者保留端号,所以不建议使用。

    ③.实际上可以通过“IP地址+端口号”的形式来区分不同的程序。

3.协议

    ①.UDP:数据打包,有限制,不连接,效率高,不可靠。(发短信、视频会议)

    ②.TCP:建立数据管道,无限制,面向连接,效率低,可靠。(打电话)

套接字头(Socket)

    ①.套接字头是网络通信的基本操作单元,是不同主机之间的进程经行双向通信的断面点。

    ②.简单来说就是通信的两方的一种约定,用套接字头中的相关函数来完成通信的过程。

    ③.通信两端都应该有Socket对象。

    ④.所有的通信都是通过Socket间的IO进行操作的。

InetAddress类

1.定义

    InetAddress类用于描述和包装一个Internet IP地址,并提供了相关的常用方法。

2.常用方法

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

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

    ③.String getHostAddress()    返回 IP 地址字符串(以文本表现形式)。 

    ④.String getHostName()    获取此 IP 地址的主机名。

UDP的网络编程

1.发送

    ①.套接字头用  DatagramSocket()        构造数据报套接字并将其绑定到本地主机上任何可用的端口。 

    ②.数据打包用  DatagramPacket(byte[] buf, int length, InetAddress address, int port)      构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

    ③.调用套接字头的 void send(DatagramPacket p)方法,将数据包发送。

    ④.调用套接字头的void close()    关闭此数据报套接字。

public class SendDemo {public static void main(String[] args) throws IOException {// 创建发送端Socket套接字头DatagramSocket ds = new DatagramSocket();// 创建键盘录入BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 读取数据String line = null;while ((line = br.readLine()) != null) {//如果键盘录入886则退出if (line.equals("886")) {break;}//封装数据byte[] bys = line.getBytes();int leng = bys.length;InetAddress id = InetAddress.getByName("192.168.1.11");int port = 10086;DatagramPacket dp = new DatagramPacket(bys, leng, id, port);// 发送数据ds.send(dp);}// 关闭套接字头ds.close();}}

2.接收

    ①.套接字头用  DatagramSocket(int port)       创建数据报套接字并将其绑定到本地主机上的指定端口。

    ②.创建数据包用于接收数据  DatagramPacket(byte[] buf, int length)      构造 DatagramPacket,用来接收长度为 length 的数据包。

    ③.调用套接字头的void receive(DatagramPacket p) 方法,从此套接字接收数据报包。

    ④.调用套接字头的void close()    关闭此数据报套接字。

    ⑤.解析数据包

    ⑥.调用套接字头的void close()    关闭此数据报套接字。

public class ReceiveDemo {public static void main(String[] args) throws IOException {DatagramSocket ds = new DatagramSocket(10086);while (true) {byte[] bys = new byte[1024];DatagramPacket dp = new DatagramPacket(bys, bys.length);ds.receive(dp);InetAddress id = dp.getAddress();String s = id.getHostName();byte[] bys2 = dp.getData();int length = dp.getLength();String s2 = new String(bys2, 0, length);System.out.println(s);System.out.println(s2);}}}

TCP的网络编程

1.发送

    ①.套接字头用 Socket(InetAddress address, int port)         创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

    ②.获取输入流,写数据    OutputStream getOutputStream()     返回此套接字的输出流。os.write(        .getBytes)

    ③.调用套接字头的void close()    关闭此数据报套接字。

public class ClientDemo {public static void main(String[] args) throws IOException {//创建客户端套接字头Socket s = new Socket("192.168.1.11",10086);//创建带缓冲区的字符输入流,用来读取目标文件BufferedReader br = new BufferedReader(new FileReader("LT.txt"));//通过套接字头获取字节输出流,并且通过转换流,包装成带缓冲区的字符输出流BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));//开始读取数据和输出数据String line = null;while((line = br.readLine())!=null){bw.write(line);bw.newLine();bw.flush();}//通知服务端的套接字头输出流使用完毕s.shutdownOutput();//通过套接字头获取字节输入流,用来接收服务端发送的反馈InputStream is = s.getInputStream();//定义字节数组,用来读取数据byte[] bys = new byte[1024];//将数据读取到数组中int a = is.read(bys);//将数组的数据转换成字符串String str = new String(bys,0,a);System.out.println(str);//释放资源br.close();s.close();}}

2.接收

    ①.套接字头用  ServerSocket(int port)     创建绑定到特定端口的服务器套接字。

    ②.监听客户端连接  Socket accept()      侦听并接受到此套接字的连接。

    ③.获取输入流,读取数据   InputStream getInputStream()       返回此套接字的输入流。String(bys,0,len)

    ④.调用套接字头的void close()    关闭此数据报套接字。

public class ServerDemo {public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(10086);Socket s = ss.accept();BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));BufferedWriter bw = new BufferedWriter(new FileWriter("SZ.txt"));String line = null;while ((line = br.readLine()) != null) {bw.write(line);bw.newLine();bw.flush();}OutputStream os = s.getOutputStream();os.write("输入完毕".getBytes());bw.close();s.close();}}

0 0
原创粉丝点击