---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一、概述
注:以前软考的时候总结过一篇关于网络的基本知识,大家可以参考一下http://blog.youkuaiyun.com/jin870132690/article/details/41597135
只要接触过网络的人就不会不知道网络的重要性,网络编程指的是编写与其他计算机进行通信的程序。java已经将网络程序所需的东西封装成了不同的类。大大简化了我们的编程的难度。
1、网络模型
网络模型包括OSI七层模型和TCP\IP模型
2、通讯要素
1、IP地址
它是网络中的设备标识,分为ipv4和ipv6,常见的ip4地址分ABC三类
IP地址在java中对应的类是InetAddress
- <span style="font-size:14px;"> //获取本地主机名
- InetAddress ip = InetAddress.getLocalHost();
- //根据主机名或者ip,获取Ip地址
- ip = InetAddress.getByName("www.baidu.com");
- //有的时候主机可能不唯一,用getAllByName();
- // InetAddress[] ip2 = InetAddress.getAllByName(ip.getHostName());
- // for (InetAddress inetAddress : ip2) {
- // System.out.println(inetAddress);
- System.out.println("address:" + ip.getHostAddress());
- System.out.println("name:" + ip.getHostName());</span>
2、端口号
端口号用于识别不同的进程,有效端口号为0-65535,其中0-1024是系统使用或保留端口号,尽量不要使用
3、通讯协议
即通信规则,包含TCP和UDP协议
UDP是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去。适用于一次只传送少量数据、对可靠性要求不高的应用环境
常用于UDP连接的比如说在线视频语音聊天等应用环境,对可靠性要求低,丢失一点数据也无所谓。
TCP是基于连接的协议,也就是说,在正式收发数据前,要进行三次握手,确保和对方建立可靠的连接。
TCP协议能为应用程序提供可靠的通信连接,对可靠性要求高的数据通信系统往往使用TCP协议传输数据。
TCP协议一般用于文件传输、收发邮件等对数据准确性要求较高的活动。
二、UDP传输
1, 接收端与发送端交互过程
接收数据包
a,通过DatagramSocket创建发送端
b,将要发送的数据封装在DatagramPacket包中
c,调用send方法发送。
接收数据包
a,通过DatagramSocket创建接收端
b,将受到的数据封装在DatagramPacket包中
c,通过recive接收包
2、举例:聊天室
接收端
- <span style="font-size:14px;">package jinfulin.UDP.Demo;
- import java.io.IOException;
- import java.net.DatagramPacket;
- import java.net.DatagramSocket;
- public class UDPReDemo {
- /*
- * 需求:创建接收端并接收文字 分析:
- * 1,建立socket服务,
- * 2,建立packet包
- * 3,将接收到的数据封装在packet中
- * 4,读取包中的内容
- * 5,关闭服务
- */
- public static void main(String[] args) throws IOException {
- System.out.println("接收端已启动");
- while (true)// 接收端一直启动
- {
- // 1,建立socket服务
- DatagramSocket ds = new DatagramSocket(12000);
- // 2,建立packet包
- byte[] buf = new byte[1024];
- DatagramPacket dp = new DatagramPacket(buf, buf.length);
- // 3,接收数据包
- ds.receive(dp);
- // 4,读取包中的内容
- String ip = dp.getAddress().getHostAddress();
- // String name = dp.getAddress().getHostName();
- // int pot = dp.getPort();
- String txt = new String(dp.getData(), 0, dp.getLength());
- System.out.println(ip + ":::::" + txt);
- ds.close();
- }
- }
- }
- </span>
发送端
- <span style="font-size:14px;">package jinfulin.UDP.Demo;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.net.DatagramPacket;
- import java.net.DatagramSocket;
- import java.net.InetAddress;
- public class UDPSendDemo {
- /*
- * 需求:创建发送端并发送文字
- * 思路:1,建立socket服务
- * 2,建立发送的数据
- * 3,将发送的数据封装在packet包中
- * 4,发送数据
- * 5,关闭
- *
- */
- public static void main(String[] args) throws IOException {
- System.out.println("发送端已启动");
- //1,建立socket服务
- DatagramSocket ds = new DatagramSocket(8888);
- BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
- String line = null;
- while ((line = bufr.readLine()) != null)
- {
- //2,建立发送的数据
- // String str = "金福林";
- // byte[] buf = str.getBytes();
- byte[] buf = line.getBytes();
- //3,将发送的数据封装在packet包中
- DatagramPacket dp = new DatagramPacket(
- buf,buf.length,InetAddress.getByName("110.251.19.2"),12000);
- //,发送数据
- ds.send(dp);
- if("over".equals(line)){
- break;
- }
- }
- //5,关闭
- ds.close();
- }
- }
- </span>
三、TCP传输
1、Socket与ServerSocket
1,Socket
Socket为套接字的意思,你也可以把它理解为插座或者港口。
套接字用于将应用程序与端口连接起来,是一个假想的连接装置。
2,ServerSocket
ServerSocket表示服务器端的套接字,其主要功能是等待来着网络的请求,它可以通过制定的端口来等待连接的套接字。
2、服务器与客户端交互的过程
a,服务端创建一个ServerSocket,调用accept()方法等待客户机。
b,客户机创建一个Socket请求与用户连接。
c,服务器接收客户端的请求,同时建立一个新的Socket与客户建立联系,服务器继续等待新的请求
3、示例(上传图片):
客户端
- <span style="font-size:14px;">package jinfulin.TCP.Test.UpLoadPic;
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.BufferedReader;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStream;
- import java.net.Socket;
- /*
- * 上传图片的客户端
- */
- public class UpLoadpicClient {
- //思路:
- //1,创建Socket(插座)
- //2,创建源:本地某个图片
- //3,创建目的:服务端
- //4,加缓冲区将写入流中
- //5,创建读取流
- //6,读取服务器返回的数据
- //7,关闭资源
- public static void main(String[] args) throws IOException {
- //1,创建Socket(插座)
- Socket s = new Socket("127.0.0.1", 8881);
- //2,创建源:本地某个图片
- FileInputStream pic = new FileInputStream("f:\\111.jpg");
- //3,创建目的:服务端(输出流)
- OutputStream out = s.getOutputStream();
- BufferedOutputStream bufout = new BufferedOutputStream(out);
- //4,加缓冲区将写入流中
- BufferedInputStream bufIn = new BufferedInputStream(pic);
- int ch = 0;
- while((ch = bufIn.read()) != -1){
- // out.write(ch);
- bufout.write(ch);
- }
- //----告诉服务端这里已经写完
- s.shutdownOutput();
- //5,创建输入流
- InputStream in = s.getInputStream();
- //6,读取服务器返回的数据
- BufferedReader bufr =new BufferedReader(new InputStreamReader(in));
- String line = bufr.readLine();
- System.out.println(line);
- //7,关闭资源
- bufIn.close();
- bufr.close();
- pic.close();
- s.close();
- }
- }
- </span>
服务端
- <span style="font-size:14px;">package jinfulin.TCP.Test.UpLoadPic;
- import java.io.IOException;
- import java.net.ServerSocket;
- import java.net.Socket;
- public class UpLoadpicServer {
- public static void main(String[] args) throws IOException {
- //1,创建服务端插座ServerSocket
- ServerSocket ss = new ServerSocket(8881);
- while(true){
- //2,获取客户端
- Socket s = ss.accept();
- new Thread(new UpLoadTask(s)).start();
- }
- // ss.close();
- }
- }
- </span>
服务端调用的方法
- <span style="font-size:14px;">
- package jinfulin.TCP.Test.UpLoadPic;
- import java.io.BufferedInputStream;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.Socket;
- /**
- * @author 金福林
- *
- */
- public class UpLoadTask implements Runnable {
- private Socket s;
- public UpLoadTask(Socket s) {
- super();
- this.s = s;
- }
- public void run() {
- try {
- //2.1获取ip地址,ip打印
- String ip = s.getLocalAddress().getHostAddress();
- String name = s.getLocalAddress().getHostName();
- System.out.println(ip + "....");
- //3,源:获取客户端发来的数据(输出流)
- InputStream in = s.getInputStream();
- //4,目的:将读取到的文件写入一个目录中
- File dir = new File("f:\\" + name);
- if(!dir.exists())
- dir.mkdirs();
- File file = new File(dir,"server.jpg");
- FileOutputStream fos = new FileOutputStream(file);
- //5,循环写入
- int ch = 0;
- BufferedInputStream bufIn = new BufferedInputStream(in);
- while((ch = bufIn.read()) != -1)
- {
- fos.write(ch);
- }
- //6,获取Socket的输出流,将"上传成功"返回给客户端
- OutputStream out = s.getOutputStream();
- out.write("上传成功!".getBytes());
- //7,关闭资源
- bufIn.close();
- fos.close();
- s.close();
- } catch (Exception e) {
- }
- }
- }
- </span>
四、URL类
类 URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。
URL类可以解析客户端给服务端发的请求
常见方法
String getProtocol();//获取协议名称
String getHost();//获取主机名
int getPort();//获取端口号
String getFile();//获取URL文件名
String getPath();//获取此URL的路径部分
String getQuery();//获取此URL的查询部
举例:
- <span style="font-size:14px;"><span style="white-space:pre"> </span>String str_url = "http://127.0.0.1:8080/myweb/1.html";
- URL url = new URL(str_url);
- InputStream in = url.openStream();
- byte[] buf = new byte[1024];
- int len = in.read(buf);
- String text = new String(buf,0,len);
- System.out.println(text);
- in.close();</span>
一、什么是Socket?
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
在Java中,Socket和ServerSocket类库位于Java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。
在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的并没有差别,不因为在服务器端或在客户端而产生不同级别。
不管是Socket还是ServerSocket它们的工作都是通过Socket类及其子类完成的。
Socket基于TCP链接,数据传输有保障
Socket适用于建立长时间链接
Socket编程通常应用于即时通讯
1.服务器监听
2.客户端发出请求
3.建立链接
4.通信
二、Socket通信实现步骤
1.创建ServerSocket和Socket
2.打开连接Socket的输入/输出流
3.按照协议对Socket进行读写/操作
4.关闭输入输出流、关闭Socket
五、最后
关于网络的知识还有很多,java主要就应用于web开发, 需要大家以后在实践中反复的练习
本文详细介绍Java网络编程的基础知识,包括网络模型、通讯要素、UDP与TCP传输方式,并给出具体示例代码,帮助读者掌握Java网络编程的核心概念和技术。

被折叠的 条评论
为什么被折叠?



