JAVA入门到精通-第85讲-url.port.socket编程原理
端口(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了。4
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]
x
/**
* 这是第一个服务器端程序,让它在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();
}
}
}
/**
* 这是一个客户端程序,可以连接服务器端口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();
}
}
}