黑马程序员_JavaSE基础知识总结十八:网络编程
2015-11-14 10:19
736 查看
------ android培训、java培训、期待与您交流!
----------
一、协议(TCP/IP)
TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。
TCP/IP协议的由来
在阿帕网(ARPR)产生运作之初,通过接口信号处理机实现互联的电脑并不多,大部分电脑相互之间不兼容,在一台电脑上完成的工作,很难拿到另一台电脑上去用,想让硬件和软件都不一样的电脑联网,也有很多困难。当时美国的状况是,陆军用的电脑是DEC系列产品,海军用的电脑是Honeywell中标机器,空军用的是IBM公司中标的电脑,每一个军种的电脑在各自的系里都运行良好,但却有一个大弊病:不能共享资源。
互联网之父--瑟夫(Vinton G.Cerf)
1997年,为了褒奖对因特网发展作出突出贡献的科学家,并对TCP/IP协议作出充分肯定,美国授予为因特网发明和定义TCP/IP协议的文顿·瑟夫和卡恩“国家技术金奖”。这无疑使人们认识到TCP/IP协议的重要性。
tcp/ip基础--ip地址与包的路由传递
ip地址
概述:每个internet上的主机和路由器都有一个ip地址,它包括网络号和主机号,所有ip地址都是32位的,ip地址按照国际标准的划分为a,b,c,d,e五种类型。
UDP: 1.将数据及源和目的封装成数据包中,不需要建立连接。
* 2.每个数据报包的大小在限制在64k内。
* 3.因无连接,是不可靠的协议。
* 4.不需要建立连接,速度快。
*
* 主要应用:视频电话会议系统、传输视频、mp3等
*
*
*
TCP: 1.建立连接,形成传输数据的通道。
* 2.在连接中进行大数据传输。
* 3.通过三次握手完成连接,是可靠协议。
* 4.因为必须建立连接,所以效率会稍低。
*
* 主要应用:TCP协议中植入了各种安全保障功能,广泛用于数据下载、文件传输、可靠性要求高的应用
*/
二、端口(port)--概念
在网络技术中,端口(Port)有好几种意思。集线器、交换机、路由器的端口指的是连接其他网络设备的接口,如RJ-45端口、Serial端口等。我们这里所指的端口不是指物理意义上的端口,而是特指TCP/IP协议中的端口,是逻辑意义上的端口。
如果把IP地址比作一间房子,端口就是出入这间房子的门。真正的房子只有几个门,但是一个IP地址的端口可以有65536(即:256*256)个之多!端口是通过端口号来标记的,端口号只有整数,范围是从0到65535(256*256-1)。
端口(port)--分类
有65536个端口0号是保留端口
1-1024是固定端口
又叫有名端口,即被某些程序固定使用,一般程序员不使用。
22:SSH远程登录协议23:telnet使用21:ftp使用
25:smtp服务使用80:iis使用7:echo服务
1025-65535是动态端口
这些端口,程序员可以使用
端口(port)--注意事项
1、在计算机(尤其是做服务器)要尽可能的少开端口;
2、一个端口只能被一个程序监听;
3、如果使用netstat -an可以查看本机有哪些端口在监听
4、可以使用netstat -anb来查看监听端口的pid,在结合任务管理器关闭不案例的端口。
三、url--概念
统一资源定位符(URL,英语Uniform Resource Locator的缩写)也被称为网页地址,是因特网上标准的资源的地址。它最初是由蒂姆·伯纳斯-李发明用来作为万维网的地址的。现在它已经被万维网联盟编制为因特网标准RFC1738了。
Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL地址,这种地址可以是本地磁盘,也可以是局域网上的某一台计算机,更多的是Internet上的站点,简单地说,URL就是Web地址,俗称“网址”,是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。
url--组成 http://www.sina.com:8080/index.html 1、协议;2、ip地址(32位);3、端口号(16位)0-65535;4、资源名称。
单工、半双工和全双工
如果甲可以向乙发送数据,但是乙不能向甲发送数据,这样的通信就是单工通信(Simplex Communication)。
单工数据传输只支持数据在一个方向上传输,就和传呼机一样。
半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信,就和对讲机(步话机)一样;
全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力,就和电话一样。
半双工网络C/S演示
[MyServer.java]
<span style="font-size:18px;color:#333333;">/**
* 这是第一个服务器端程序,让它在9999端口监听
* 可以接收客户端发来的数据
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;
public class MyServer {
public static void main(String[] args) {
new MyServer();
}
//构造函数
public MyServer(){
try {
//在9999号端口上监听
ServerSocket ss=new ServerSocket(9999);
System.out.println("9999端口监听...");
//等待某个客户端来连接,该函数会返回一个Socket连接
Socket s=ss.accept();
//要读取s中传递的数据
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader(isr);
String info=br.readLine();
System.out.println("服务器接收到:\t"+info);
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
pw.println("我是服务器,已收到你发送的信息!");
} catch (IOException e) {
e.printStackTrace();
}
}
}</span>
[MyClient.java]
半双工,客户端与服务端进行控制台输入交流
[MyServer2.java]服务端源代码
[MyClient2.java]客户端源代码
全双工客户端与服务器进行简易界面聊天
[MyServer3.java]服务器端源代码
----------
一、协议(TCP/IP)
TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。
TCP/IP协议的由来
在阿帕网(ARPR)产生运作之初,通过接口信号处理机实现互联的电脑并不多,大部分电脑相互之间不兼容,在一台电脑上完成的工作,很难拿到另一台电脑上去用,想让硬件和软件都不一样的电脑联网,也有很多困难。当时美国的状况是,陆军用的电脑是DEC系列产品,海军用的电脑是Honeywell中标机器,空军用的是IBM公司中标的电脑,每一个军种的电脑在各自的系里都运行良好,但却有一个大弊病:不能共享资源。
互联网之父--瑟夫(Vinton G.Cerf)
1997年,为了褒奖对因特网发展作出突出贡献的科学家,并对TCP/IP协议作出充分肯定,美国授予为因特网发明和定义TCP/IP协议的文顿·瑟夫和卡恩“国家技术金奖”。这无疑使人们认识到TCP/IP协议的重要性。
tcp/ip基础--ip地址与包的路由传递
ip地址
概述:每个internet上的主机和路由器都有一个ip地址,它包括网络号和主机号,所有ip地址都是32位的,ip地址按照国际标准的划分为a,b,c,d,e五种类型。
UDP: 1.将数据及源和目的封装成数据包中,不需要建立连接。
* 2.每个数据报包的大小在限制在64k内。
* 3.因无连接,是不可靠的协议。
* 4.不需要建立连接,速度快。
*
* 主要应用:视频电话会议系统、传输视频、mp3等
*
*
*
TCP: 1.建立连接,形成传输数据的通道。
* 2.在连接中进行大数据传输。
* 3.通过三次握手完成连接,是可靠协议。
* 4.因为必须建立连接,所以效率会稍低。
*
* 主要应用:TCP协议中植入了各种安全保障功能,广泛用于数据下载、文件传输、可靠性要求高的应用
*/
二、端口(port)--概念
在网络技术中,端口(Port)有好几种意思。集线器、交换机、路由器的端口指的是连接其他网络设备的接口,如RJ-45端口、Serial端口等。我们这里所指的端口不是指物理意义上的端口,而是特指TCP/IP协议中的端口,是逻辑意义上的端口。
如果把IP地址比作一间房子,端口就是出入这间房子的门。真正的房子只有几个门,但是一个IP地址的端口可以有65536(即:256*256)个之多!端口是通过端口号来标记的,端口号只有整数,范围是从0到65535(256*256-1)。
端口(port)--分类
有65536个端口0号是保留端口
1-1024是固定端口
又叫有名端口,即被某些程序固定使用,一般程序员不使用。
22:SSH远程登录协议23:telnet使用21:ftp使用
25:smtp服务使用80:iis使用7:echo服务
1025-65535是动态端口
这些端口,程序员可以使用
端口(port)--注意事项
1、在计算机(尤其是做服务器)要尽可能的少开端口;
2、一个端口只能被一个程序监听;
3、如果使用netstat -an可以查看本机有哪些端口在监听
4、可以使用netstat -anb来查看监听端口的pid,在结合任务管理器关闭不案例的端口。
三、url--概念
统一资源定位符(URL,英语Uniform Resource Locator的缩写)也被称为网页地址,是因特网上标准的资源的地址。它最初是由蒂姆·伯纳斯-李发明用来作为万维网的地址的。现在它已经被万维网联盟编制为因特网标准RFC1738了。
Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL地址,这种地址可以是本地磁盘,也可以是局域网上的某一台计算机,更多的是Internet上的站点,简单地说,URL就是Web地址,俗称“网址”,是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。
url--组成 http://www.sina.com:8080/index.html 1、协议;2、ip地址(32位);3、端口号(16位)0-65535;4、资源名称。
单工、半双工和全双工
如果甲可以向乙发送数据,但是乙不能向甲发送数据,这样的通信就是单工通信(Simplex Communication)。
单工数据传输只支持数据在一个方向上传输,就和传呼机一样。
半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信,就和对讲机(步话机)一样;
全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力,就和电话一样。
半双工网络C/S演示
[MyServer.java]
<span style="font-size:18px;color:#333333;">/**
* 这是第一个服务器端程序,让它在9999端口监听
* 可以接收客户端发来的数据
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;
public class MyServer {
public static void main(String[] args) {
new MyServer();
}
//构造函数
public MyServer(){
try {
//在9999号端口上监听
ServerSocket ss=new ServerSocket(9999);
System.out.println("9999端口监听...");
//等待某个客户端来连接,该函数会返回一个Socket连接
Socket s=ss.accept();
//要读取s中传递的数据
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader(isr);
String info=br.readLine();
System.out.println("服务器接收到:\t"+info);
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
pw.println("我是服务器,已收到你发送的信息!");
} catch (IOException e) {
e.printStackTrace();
}
}
}</span>
[MyClient.java]
<del><span style="font-size:18px;color:#333333;">/** * 这是一个客户端程序,可以连接服务器端口9999 */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.*; public class MyClient { public static void main(String[] args) { new MyClient(); } public MyClient(){ try { //Socket()就是去连接某个服务器端 127.0.0.1表示服务器的ip //9999是服务器的端口号 Socket s=new Socket("127.0.0.1",9999); //如果s连接成功,就可以发送数据到服务器端 //我们通过pw向s写数据,true表示即时刷新 PrintWriter pw=new PrintWriter(s.getOutputStream(),true); pw.println("你好吗?我是客户端"); //要读取s中传递的数据 InputStreamReader isr=new InputStreamReader(s.getInputStream()); BufferedReader br=new BufferedReader(isr); String info=br.readLine(); System.out.println("接收到服务器:\t"+info); } catch (Exception e) { e.printStackTrace(); } } } </span></del>
半双工,客户端与服务端进行控制台输入交流
[MyServer2.java]服务端源代码
<span style="font-size:18px;color:#333333;">/** * 功能:是一个服务器端,在9999端口上监听 * 可以通过控制台,输入回送给客户端的信息 */ package com.net.server2; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.*; public class MyServer2 { InputStreamReader isr,isr2; BufferedReader br,br2; PrintWriter pw; public static void main(String[] args) { new MyServer2(); } //构造函数 public MyServer2(){ try { //在9999号端口上监听 ServerSocket ss=new ServerSocket(9999); //等待客户端连接,该函数会返回一个Socket连接 Socket s=ss.accept(); //要读取s中传递的数据 isr=new InputStreamReader(s.getInputStream()); br=new BufferedReader(isr); pw=new PrintWriter(s.getOutputStream(),true); //接收从控制台输入的信息 isr2=new InputStreamReader(System.in); br2=new BufferedReader(isr2); while(true){ //接收客户端信息 String infoFromClient=br.readLine(); System.out.println("服务器接收到:\t"+infoFromClient); //接收从控制台输入的信息 System.out.println("请输入要发送到客户端的信息:"); String response=br2.readLine(); //服务器从控制台上接收bye服务器端退出 if(response.equals("bye")){ System.out.println("退出对话"); s.close(); break; } //把从控制台输入的信息,回送给客户端 pw.println(response); } } catch (IOException e) { e.printStackTrace(); }finally{ try { if(br2!=null) br2.close(); if(isr2!=null) isr2.close(); if(pw!=null) pw.close(); if(br!=null) br.close(); if(isr!=null) isr.close(); } catch (IOException e) { e.printStackTrace(); } } } }</span>
[MyClient2.java]客户端源代码
<span style="font-size:18px;color:#333333;">/** * 这是一个客户端程序,可以连接服务器端口9999 */ package com.net.client2; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.*; public class MyClient2 { InputStreamReader isr,isr2; BufferedReader br,br2; PrintWriter pw; public static void main(String[] args) { new MyClient2(); } public MyClient2(){ try { //连接服务器端 Socket s=new Socket("127.0.0.1",9999); pw=new PrintWriter(s.getOutputStream(),true); //控制台接收信息 isr=new InputStreamReader(System.in); br=new BufferedReader(isr); //从服务器接收信息 isr2=new InputStreamReader(s.getInputStream()); br2=new BufferedReader(isr2); while(true){ //客户端先从控制台接收 String info=br.readLine(); //然后发送给服务器 pw.println(info); //客户端从控制台上输入byebye信息,客户端退出 if(info.equals("byebye")){ System.out.println("客户端退出对话"); s.close(); break; } //接收从服务器发来的信息 String res=br2.readLine(); System.out.println("客户端接收到的信息:"+res); //客户端接收服务端发送来的byebye信息,客户端退出 if(res.equals("byebye")){ System.out.println("服务器端强制客户端退出对话"); s.close(); break; } } } catch (Exception e) { e.printStackTrace(); }finally{ try { if(br2!=null) br2.close(); if(isr2!=null) isr2.close(); if(pw!=null) pw.close(); if(br!=null) br.close(); if(isr!=null) isr.close(); } catch (IOException e) { e.printStackTrace(); } } } }</span>
全双工客户端与服务器进行简易界面聊天
[MyServer3.java]服务器端源代码
<span style="font-size:18px;color:#333333;">/** * 全双工服务器端,让它在9999端口监听 * 可以接收客户端发来的数据 */ package com.net.server3; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.*; import javax.swing.AbstractAction; import javax.swing.JButto b000 n; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.KeyStroke; public class MyServer3 extends JFrame implements ActionListener{ JTextArea jta; JTextField jtf; JButton jb; JPanel jp1; JScrollPane jsp; InputStreamReader isr; BufferedReader br; PrintWriter pw; public static void main(String[] args) { new MyServer3(); } //构造函数 public MyServer3(){ jta=new JTextArea(); jtf=new JTextField(20); jb=new JButton("发送"); jb.addActionListener(this); //给jb发送按钮添加快捷键(回车)事件 jb.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "fasong"); jb.getActionMap().put("fasong", new AbstractAction() { public void actionPerformed(ActionEvent e) { String info=jtf.getText(); jta.append("客户端 对 服务端说:"+info+"\r\n"); pw.println(info); jtf.setText(""); } }); jp1=new JPanel(); jp1.add(jtf); jp1.add(jb); jsp=new JScrollPane(jta); this.add(jsp,"Center"); this.add(jp1,"South"); this.setTitle("qq简易聊天--服务端"); this.setSize(350, 250); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); try { //在9999号端口上监听 ServerSocket ss=new ServerSocket(9999); //等待客户端连接 Socket s=ss.accept(); //读取从客户端发来的信息 isr=new InputStreamReader(s.getInputStream()); br=new BufferedReader(isr); pw=new PrintWriter(s.getOutputStream(),true); while(true){ //读取从客户端发来的信息 String info=br.readLine(); jta.append("客户端 对 服务端说:"+info+"\r\n"); } } catch (IOException e) { e.printStackTrace(); }finally{ try { if(pw!=null) pw.close(); if(br!=null) br.close(); if(isr!=null) isr.close(); } catch (Exception e2) { e2.printStackTrace(); } } } @Override public void actionPerformed(ActionEvent e) { //如果用户按下发送信息的按钮 if(e.getSource()==jb){ //把服务器在jtf写的 内容发送给客户端 String info=jtf.getText(); //向jta中不断追加内容 jta.append("服务端 对 客户端说:"+info+"\r\n"); pw.println(info); //清空jtf内容 jtf.setText(""); } } }</span>
<span style="font-size:18px;color:#333333;">[MyClient3.java]客户端源代码 /** * 这是一个客户端程序,可以连接服务器端口9999 */ package com.net.client3; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.*; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.KeyStroke; public class MyClient3 extends JFrame implements ActionListener{ JTextArea jta; JTextField jtf; JButton jb; JPanel jp1; JScrollPane jsp; InputStreamReader isr; BufferedReader br; PrintWriter pw; public static void main(String[] args) { new MyClient3(); } public MyClient3(){ jta=new JTextArea(); jtf=new JTextField(20); jtf.setFocusable(true); jb=new JButton("发送"); jb.addActionListener(this); //给jb发送按钮添加快捷键(回车)事件 jb.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "fasong"); jb.getActionMap().put("fasong", new AbstractAction() { public void actionPerformed(ActionEvent e) { String info=jtf.getText(); jta.append("客户端 对 服务端说:"+info+"\r\n"); pw.println(info); jtf.setText(""); } }); jp1=new JPanel(); jp1.add(jtf); jp1.add(jb); jsp=new JScrollPane(jta); this.add(jsp,"Center"); this.add(jp1,"South"); this.setTitle("qq简易聊天--客户端"); this.setSize(350, 250); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); try { //Socket()就是去连接某个服务器端 127.0.0.1表示服务器的ip Socket s=new Socket("127.0.0.1",9999); InputStreamReader isr=new InputStreamReader(s.getInputStream()); BufferedReader br=new BufferedReader(isr); pw=new PrintWriter(s.getOutputStream(),true); while(true){ //读取服务器端发来的信息 String info=br.readLine(); jta.append("服务端 对 客户端说:"+info+"\r\n"); } } catch (Exception e) { e.printStackTrace(); }finally{ try { if(pw!=null) pw.close(); if(br!=null) br.close(); if(isr!=null) isr.close(); } catch (Exception e2) { e2.printStackTrace(); } } } @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==jb){ String info=jtf.getText(); jta.append("客户端 对 服务端说:"+info+"\r\n"); pw.println(info); jtf.setText(""); } } }</span>
相关文章推荐
- vitamio播放网络音频的折腾
- iOS9与XCode7中不能使用http连接的解决办法
- Windows下git web hook免除密码输入的烦人事(SSH和HTTPS)
- 10007---JavaWeb基础--GenericServlet和HttpServlet
- 关于 Xcode7中不能加载网络资源的问题App Transport Security has blocked a cleartext HTTP (http://) resource
- android高版本后不自带httpclient相关api
- tcp协议和udp协议的差别
- python 学习笔记1--TCP客户端
- 运输层的两个主要协议:TCP和UDP
- Http协议-get、post、put、delete
- 痛苦的IFAMR http://www.jb51.net/article/34942.htm
- HttpClient4.x调用指定证书访问https
- LVS搭建集群实现负载均衡-NAT模式
- 信号量、互斥锁,读写锁和条件变量的区别 http://blog.chinaunix.net/uid-20671208-id-4935154.html
- iOS中网络请求--AFNetworking
- 卷积神经网络在自然语言处理的应用
- Linux内核工程导论–网络:TCP连接
- 【已解决】This absolute uri http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or th
- ascyhttpclient 使用心得
- erlang http post 发送数据请求