0


网络编程-TCP

什么是计算机网络?

** **计算机网络是指两台或更多的计算机组成的网络,在同一个网络中,任意两台计算机都可以直接通信,因为所有计算机都要遵循同一种网络协议。

什么是网络编程?

网络编程从大的方面就是说对信息的发送接收。

通过操作相应API调度计算机资源硬件,并且利用管道(网线)进行数据交互的过程。

更为具体的涉及:网络模型、套接字、数据包

TCP编程

当我们了解了计算机网络和网络编程之后,为了能够使在同一个网络中的任意两台计算机来实现通信,我们接下来就要使用到Socket。那么Socket是什么呢?首先Socket是一组套接字,由IP地址和端口号组成,端口号小于1024是特权用户,需要管理权限,我们能够使用的端口范围在1024到65535之间。其次一个应用程序可以通过Socket建立一个远程连接,Socket内部通过TCP/IP协议把数据传送至网络。 那么如何使用Socket来进行TCP编程呢?首先在网络协议中TCP协议是一种面向连接、可靠传输、字节流式的协议,而TCP编程又是基于TCP协议实现的,因此在我们进行TCP编程时,我们需要建立一个服务器端和一个客户端,ServerSocket作为服务器端,用来监听指定的端口,当这个端口进行客户端连接时,服务器端进入等待状态,等待客户端连接,而另一个Socket就是我们的客户端,用来连接指定服务器和端口,从而进行连接,实现客户端与服务器端的通信与交互。

接下来我们看一个实例:使用TCP编程实现 人机对话系统。

服务器端 :
1.创建一个ServerSocket,作为服务器端,用来监听8888端口。

2.运行socket,使服务器端进入等待连接状态。

3.连接到客户端之后,我们就可以获取到客户端的相关信息,并通过输入流读取到客户端的提问。

4.通过我们提前存储到Map集合中的简单对话,我们就可以通过服务器短的输出流将答案发送至客户端。

5.从而实现人机对话系统

部分代码实现如下:

package com.zym.tcp;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

public class ChartServer {
    public static void main(String[] args) {
        Map<String, String> chatMap = new HashMap<String, String>(){
            {
                put("你好", "你好呀");
                put("hi", "hi~");
                put("hello", "哈喽");
                put("吃了吗", "没呢,你呢");
                put("孤勇者", "爱你孤身走暗巷");
                put("有请潘周聃", "潘周聃,今年29岁,苏黎世理工大学.....");
                put("很高兴认识你", "我也是哦");
            }
        };
        try (ServerSocket server = new ServerSocket(8888)) {
            while(true) {
                //发生客户端连接
                Socket client = server.accept();
                //获取该客户端的IP地址
                String clientIP = client.getInetAddress().getHostAddress();
                try(BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
                    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));){
                    
                    //获取该客户端的提问??
                    String question = reader.readLine();
                    if(question!=null) {
                        System.out.println("【服务器】来自客户端" + clientIP + "的提问:" + question);
                    
                        //获取该问题的答案
                        String answer = chatMap.get(question);
                        answer = answer == null?"我不知道你在说什么":answer;
                    
                        //发送至客户端
                        writer.write(answer);
                    }
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
                
    }
}

客户端:

1.创建一个Socket,作为客户端,用来连接指定服务器和端口。

2.运行socket,进入连接状态,直到找到服务器端,进行连接。

3.连接到服务端之后,客户端通过输出流将提问发送至服务器端。

4.服务器端接收到之后,会通过输出流将答案发送回来,之后我们只需在客户端使用输入流读取该答案即可。

5.从而实现人机对话系统

package com.zym.tcp;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class ChatClient {
    public static void main(String[] args) throws UnknownHostException, IOException {
        //创建Scoket,连接服务器
        try(Scanner input = new Scanner(System.in);){
            while(true) {
                try(Socket client = new Socket("172.20.10.2",8888);
                        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
                        BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));){
                        //获取控制台的输入(问题)
                    String question = input.nextLine();
                    if(question.equals("over")) {
                        break;
                    }
                    //发送问题
                    writer.write(question);
                    writer.flush();
                
                    //暂时关闭本次输出
                    client.shutdownOutput();
            
                    //获取来自服务器的“答案”
                    String answer = reader.readLine();
                    System.out.println("【客户端】来自服务器的回答:" + answer);
                }
            }
            System.out.println("Game over!");
        }
    }
}

标签: java eclipse

本文转载自: https://blog.csdn.net/qq_51956240/article/details/125825108
版权归原作者 爱喝冰红茶阿 所有, 如有侵权,请联系我们删除。

“网络编程-TCP”的评论:

还没有评论