打赏

JAVA入门到精通-第85讲-url.port.socket编程原理

TCP/IP协议中的端口,是逻辑意义上的端口;
netstat -an
端口监听---提供服务;

smtp简单邮件传输协议
1025-65535是动态端口

能不开的端口就关闭;

netstat  -anb 
查看进程ID号;

进程号PID---1316;

被svchost.exe监听

svchost     system

PID 进程标识

1433      sqlserver.exe

-url  统一资源定位符,网页地址



-单工、半双工、全双工通信
 -BP机、对讲机、电话


监听的一方---服务器;ServerSocket()
accept()等待连接,一直等待;
readLine() 读取数据;
println() 回送数据;

主动连接的一方---客户端;
Socket() 发送请求;
println()发送数据;
readLine()读取从服务器发来的数据;


-netTestServer 服务器端
import java.net.*;
//在9999号端口监听
ServerSocket  ss=new  ServerSocket(9999);
System.out.println("xxxxxxx");
//该函数会返回一个Socket连接
ss.accept(); 




 11没有打印出来,没有连接,会一直阻塞在这里,等待连接;

-netTestClient客户端
Socket("服务器IP地址",“端口号”);
需要抛出异常;
如果在监听,Socket 会打成一个通道;


//通过pw,向s写数据;
//客户端,服务器端的s是同一个连接,在一个通道里面通话;
//true表示及时刷新
PrintWriter pw=new  PrintWriter(s.getOutputStream(),true);


-服务器读取数据readLine();


br 主要是用来读的;接收信息;

服务器端println();
pw 服务器给客户端发送一句话;

客户端println();
客户端会送给服务器;

客户端readLine();


端口(port)--概念

    在网络技术中,端口(Port)有好几种意思。集线器、交换机、路由器的端口指的是连接其他网络设备的接口,如RJ-45端口、Serial端口等。我们这里所指的端口不是指物理意义上的端口,而是特指TCP/IP协议中的端口,是逻辑意义上的端口。

    如果把IP地址比作一间房子,端口就是出入这间房子的门。真正的房子只有几个门,但是一个IP地址的端口可以有65536(即:256*256)个之多!端口是通过端口号来标记的,端口号只有整数,范围是从065535(256*256-1)

 

端口(port)--分类

65536个端口  0号是保留端口

1-1024是固定端口

又叫有名端口,即被某些程序固定使用,一般程序员不使用。

22SSH远程登录协议  23telnet使用    21ftp使用

25smtp服务使用    80iis使用 7echo服务

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、协议;2ip地址(32)3、端口号(16)0-655354、资源名称。

 

单工、半双工和全双工

    如果甲可以向乙发送数据,但是乙不能向甲发送数据,这样的通信就是单工通信(Simplex Communication)

    单工数据传输只支持数据在一个方向上传输,就和传呼机一样。

    半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信,就和对讲机(步话机)一样;

全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力,就和电话一样。



半双工网络C/S演示

[MyServer.java]

x
1
/**
2
 * 这是第一个服务器端程序,让它在9999端口监听
3
 * 可以接收客户端发来的数据
4
 */
5
6
import java.io.BufferedReader;
7
import java.io.IOException;
8
import java.io.InputStream;
9
import java.io.InputStreamReader;
10
import java.io.PrintWriter;
11
import java.net.*;
12
13
public class MyServer {
14
    public static void main(String[] args) {
15
        new MyServer();
16
    }
17
    
18
    //构造函数
19
    public MyServer(){
20
        try {
21
            //在9999号端口上监听
22
            ServerSocket ss=new ServerSocket(9999);
23
            System.out.println("9999端口监听...");
24
            //等待某个客户端来连接,该函数会返回一个Socket连接
25
            Socket s=ss.accept();
26
            //要读取s中传递的数据
27
            InputStreamReader isr=new InputStreamReader(s.getInputStream());
28
            BufferedReader br=new BufferedReader(isr);
29
            
30
            String info=br.readLine();
31
            System.out.println("服务器接收到:\t"+info);
32
            
33
            PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
34
            pw.println("我是服务器,已收到你发送的信息!");
35
            
36
        } catch (IOException e) {
37
            e.printStackTrace();
38
        }
39
    }
40
}
41

[MyClient.java]
x
35
 
1
/**
2
 * 这是一个客户端程序,可以连接服务器端口9999
3
 */
4
5
import java.io.BufferedReader;
6
import java.io.IOException;
7
import java.io.InputStreamReader;
8
import java.io.PrintWriter;
9
import java.net.*;
10
11
public class MyClient {
12
    public static void main(String[] args) {
13
        new MyClient();
14
    }
15
    
16
    public MyClient(){
17
        try {
18
            //Socket()就是去连接某个服务器端 127.0.0.1表示服务器的ip
19
            //9999是服务器的端口号
20
            Socket s=new Socket("127.0.0.1",9999);
21
            //如果s连接成功,就可以发送数据到服务器端
22
            //我们通过pw向s写数据,true表示即时刷新
23
            PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
24
            pw.println("你好吗?我是客户端");
25
            //要读取s中传递的数据
26
            InputStreamReader isr=new InputStreamReader(s.getInputStream());
27
            BufferedReader br=new BufferedReader(isr);
28
            String info=br.readLine();
29
            System.out.println("接收到服务器:\t"+info);
30
        } catch (Exception e) {
31
            e.printStackTrace();
32
        }
33
    }
34
}
35























posted on 2018-12-01 00:32  XuCodeX  阅读(368)  评论(0编辑  收藏  举报

导航