TCP网络编程

一、网络编程基本概念

1. 什么是计算机网络
分布在不同地域的计算机, 通过硬件等网络设备使用通信线路互相连接形成的一个网格系统.
计算机网络, 可以很方便的进行 信息的传递, 资源的共享!


2. 什么是计算机的IP地址
IP地址 是计算机在互联网中的唯一标识 . 就像人在社会中的身份证号码.
本机IP:
127.0.0.1
localhost


3. 什么是 网络中 网站的域名
域名可以简单的理解为, IP地址的别名. 更方便记忆, 当输入域名后(例如www.baidu.com) , 计算机会访问域名解析商 , 然后得到ip地址, 再进行访问.


4. 什么是计算机的端口号
端口号的范围 0-65535 之间 . *****
与ip地址很相似, IP地址是计算机在网络中的唯一标识 .
端口号是计算机中 程序的标识 . 用于在一台计算机中区分不同的应用程序
端口号在使用时 , 应尽量避免0-1024之间的端口号, 因为已经被一些知名的软件 和 windows操作系统所占用了.


5. 什么是计算机之间的通信协议
是计算机与计算机之间交流的标准 .
是对数据的 传输速率, 传入接口, 步骤控制 出错控制 等等 制定的一套标准 !
常用的通信协议:
1. http协议 : 超文本传输协议 . 80端口号
2. https协议: 安全的超文本传输协议 443端口号
3. ftp协议: 文件传输协议 21端口号
4. TCP协议: 传输控制协议
5. UDP协议: 数据报协议

6.网络 编程程序的分类:

1.B/S 程序 : 浏览器与服务器程序
2.C/S 程序 : 客户端与服务器程序

7.TCP协议 - OSI网络模型

指的是 从一台计算机的软件中, 将数据发送到另一台计算机的软件中的过程.
七层网络模型: 应用层 / 表现层 / 会话层 / 传输层 / 网络层 / 数据链路层 / 物理层


三次握手 和 四次挥手 熟悉

第一次握手:客户端向服务器端发起连接请求,等待服务器确认。

第二次握手:服务器端向客户端回送一个响应,通知客户端收到了连接请求。

第三次握手:客户端再次向服务器端发送确认信息,确认连接。

第一次挥手:客户端向服务器发送断开请求。

第二次挥手:服务器收到请求后,向客户端回一个应答,接着服务器进入等待关闭状态,TCP处于半关闭状态。

第三次挥手:服务器也打算断开连接,向客户端发送报文。

第四次挥手:客户端收到报文后,回复一个响应。双方关闭。

二、TCP程序

需要用到两个类来编写TCP的cs程序

1、ServerSocket 搭建服务器

2、Socket 搭建客户端

ServerSocket用来搭建服务器,搭建完毕后,会绑定一个端口号。

然后此服务器可以等待客户端连接。

每连接一个客户端,服务器就会得到一个新的Socket对象,用于跟客户通信。

Socket是两台计算机之间通信的端点。一边持有一个socket对象,来沟通。socket像电话的作用。

下面我们来演示一下服务器与客户端连接的全过程,注:用两个类来通信,一个搭建服务器,一个搭建客户端。

第一步,我们先来搭建服务器:起端口号为:10086

ServerSocket server = new ServerSocket(10086); //搭建服务器

第二步:用accept来接收客户端的连接,并且将链接好的端口起名为socket

Socket socket = server.accept(); //等待客户端连接,连接好的端点为socket

第三步:创建一个客户端:

Socket socket = new Socket("127.0.0.1",10086);

端口中的参数是IP地址和端口号。本机IP地址为127.0.0.1或localhost。端口号就是服务器的端口号。

这样运行两个类,我们的服务器和客户端就连接成功了。

下面我们进行一些简单的通信。通信都是用socket来进行通信的。用输入输出流来进行交流。

服务器端发消息: 

//发消息
        OutputStream os = socket.getOutputStream(); //端点调用输出流
        PrintStream ps = new PrintStream(os);//将输出流转换成打印流
        ps.println("欢迎连接本服务器!");

客户端收消息:

InputStreamReader将字节流转换为字符流,BufferedReader从字符流中缓存字符。

InputStream is = socket.getInputStream(); //用端点调用输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String text = br.readLine();
        System.out.printf("客户端接收到的消息为:"+text);

 客户端的发消息,服务器的收消息的方法都同上。

注:必须有一端发,一端收,不能两端同时都发。

整体的代码如下:代码示例:

服务器端:

public class Demo1 {
    public static void main(String[] args) throws IOException {
       ServerSocket server = new ServerSocket(10086); //搭建服务器
        System.out.println("服务器搭建完毕!");
        Socket socket = server.accept(); //等待客户端连接,连接好的端点为socket
        System.out.println("一个客户端已成功连接√");
        //发消息
        OutputStream os = socket.getOutputStream(); //端点调用输出流
        PrintStream ps = new PrintStream(os);//将输出流转换成打印流
        ps.println("欢迎连接本服务器!");
        //接收消息
        InputStream is = socket.getInputStream(); //用端口接收流
        /**
         * InputStreamReader将字节流转换为字符流
         * BufferedReader从字符流中缓存字符
         */
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String text = br.readLine();
        System.out.printf("服务器接到了客户端的回复:"+text);
        System.out.printf("服务器程序执行结束!");
    }
}

客户端:

public class Demo2 {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",10086);
        InputStream is = socket.getInputStream(); //用端点调用输入流
        /**
         * InputStreamReader将字节流转换为字符流
         * BufferedReader从字符流中缓存字符
         */
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String text = br.readLine();
        System.out.printf("客户端接收到的消息为:"+text);
        OutputStream os = socket.getOutputStream();
        PrintStream ps = new PrintStream(os);
        ps.println("服务器你好!");
    }
}

运行结果:

执行完服务器端,服务器端等待客户端连接。 

再运行客户端:客户端代码结果

 服务器端结果:整个结束。

 三、服务器中加入多线程

上面的方法,我们一个服务器可以连接多个客户端,但是只能按顺序执行,处理完第一个客户端的事情后,才能处理第二个客户端。效率太低,服务器不可能一次只处理一个客户端的事情。所以我们需要加入多线程技术。多线程技术连接:

https://mp.csdn.net/mp_blog/creation/editor/121070409icon-default.png?t=M1L8https://mp.csdn.net/mp_blog/creation/editor/121070409

循环接收客户端,在接收客户端后面,加入多线程。每接收一个客户端,就进入一个新的线程中。各线程完成各线程的事情。 

请阅读源码:

public class Demo3 {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(20086);
        while(true){
           Socket socket = server.accept();
           new Thread(){
               @Override
               public void run() {
                   try {
                       InputStream is = socket.getInputStream();
                       BufferedReader br = new BufferedReader(new InputStreamReader(is));
                       System.out.println(Thread.currentThread().getName());
                       System.out.println("客户端发来的消息:"+br.readLine());
                       OutputStream os = socket.getOutputStream();
                       PrintStream ps = new PrintStream(os);
                       ps.println("我是服务器,感谢链接");
                       Thread.sleep(10000);   //休眠十秒
                       System.out.println(Thread.currentThread().getName()+"休眠完毕!");
                   } catch (IOException e) {
                       e.printStackTrace();
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
               }
           }.start();
        }
    }
}

于是我们在客户端不断连接。

运行结果如下:多线程一起运行。一个服务器连接多个客户端,并同时处理。

 

 

本文到这里,关于TCP网络编程的方法就全部介绍完毕了。

作者码字不易,您的点赞收藏是对我的鼓励~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值