JAVA网络编程(TCP)

本文介绍了Java网络编程中Socket的基本概念,阐述了其在多应用通信中的作用,并通过实例展示了如何使用Socket实现客户端与服务器的TCP交互。重点讲解了服务器与客户端Socket的分配方式以及实际应用中的操作过程。
摘要由CSDN通过智能技术生成

要想认识并学习JAVA网络编程首先我们要知道一个概念。什么是Socket?

在开发网络应用程序的时候我们会遇到Socket这个概念;这是一个抽象的概念,一个应用程序通过Socket来建立一个远程连接;而Socket内部通过TCP/IP协议把数据传输到网络。

┌───────────┐                                   ┌───────────┐
│Application│                                   │Application│
├───────────┤                                   ├───────────┤
│  Socket   │                                   │  Socket   │
├───────────┤                                   ├───────────┤
│    TCP    │                                   │    TCP    │
├───────────┤      ┌──────┐       ┌──────┐      ├───────────┤
│    IP     │<────>│Router│<─────>│Router│<────>│    IP     │
└───────────┘      └──────┘       └──────┘      └───────────┘

为什么需要Socket进行网络通信?

因为仅仅通过IP地址进行通信是不够的,同一台计算机同一时间会运行多个网络应用程序;这时如果只有一个IP地址时,他无法判断发送给哪个应用程序,所以操作系统抽象出Socket接口,每个程序需要对应各自的Socket,数据包才能根据Socket正确的发到对应的应用程序。

对服务器来说:可以把Socket是指定的IP地址和指定的端口号;

对客户端来说:他的Socket是它所在计算机的IP地址和一个由操作系统分配的随机端口号;

实例:TCP实现人机交互

客户端:

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

public class Test2 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		while(true) {
		try (//创建Socket,连接服务器
		 Socket client = new Socket("192.168.254.167",9966);
				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);
		
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
		System.out.println("Game over");
	}
}

服务器端:

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;
import java.util.prefs.BackingStoreException;

public class Test2 {
	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(9966)){
			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();
				
				System.out.println("【服务器】来自客户端" + clientIP + "的提问" + question);
				
				//获取该问题的答案
				
				String answer = chatMap.get(question);
				answer = answer == null ? "我不知道你在说什么":answer;
				
				writer.write(answer);
				writer.flush();
			 }
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

 运行结果:

 

  • 16
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值