网络编程-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!");
		}
	}
}

 

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>