IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 网络编程--TCP编程 -> 正文阅读

[Java知识库]网络编程--TCP编程

一、什么是Socket

Socket是一个抽象概念,一个应用程序通过一个Socket来建立一个远程连接,而Socket内部通过TCP/IP协议把数据传输给网络。

?

Socket,TCP和部分IP的功能都是由操作系统提供的,Java提供的Socket类就封装了操作系统提供的接口:SocketServer类和Socket类。

一个Socket就是由IP地址和端口号(范围是0-65535)组成的,小于1024的端口叫做特权端口,需要管理员权限,大于1024的端口可以由任意用户应用程序打开

使用Socket进行网络编程时,本质就是两个编程之间的网络通信。其中一个进程充当服务器端,主动监听某个端口,另一个进程就要充当客户端,它必须主动连接服务器端的IP地址和指定端口,如果连接成功,服务器端就和客户端成功的建立了一个TCP连接

二、用实例(简易聊天室)来进行TCP网络编程

1.编写服务器端程序,Java标准库提供了ServerSocket来实现对指定端口的监听、

代码细节

(1)用一个while循环来可以不断接收

(2)不在map里的自动回复设置回复“我不知道你在说什么”

(3)发送“over”,程序终止

package com.yy.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 chatServer {
	public static void main(String[] args) {
     
        //创建一个Map集合
		Map<String, String> chatMap = new HashMap<String, String>(){
			{
				put("你好", "你好呀");
				put("hi", "hi~");
				put("hello", "哈喽");
				put("吃了吗", "没呢,你呢");
				put("孤勇者", "爱你孤身走暗巷");
				put("有请潘周聃", "潘周聃,今年29岁,苏黎世理工大学.....");
				put("很高兴认识你", "我也是哦");
			}
		};
             //使用ServerSocket来监听指定端口
		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();
		}
		
	}

}

接下来服务器进入“等待状态”
?如果有客户端连接时,该方法返回此客户端的Socket

2.编写客户端程序

Socket:客户端进行通信的组件

代码细节

(1)用一个while循环来可以不断发送

(2)OutputStreamWriter:字符输出流:将客户端写入的内容传至服务器端

(3)InputStreamReader:字符输入流:读取服务器的内容

package com.yy.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.util.Scanner;

public class chatClient {
	public static void main(String[] args) {
        //创建输入流
		Scanner input = new Scanner(System.in);
		
		//创建Socket,连接服务器
		while(true) {
		try (Socket client = new Socket("192.168.254.182",9966);
                //OutputStreamWriter:字符输出流:将客户端写入的内容传至服务器端
				BufferedWriter writer = new BufferedWriter(new 
                       OutputStreamWriter(client.getOutputStream()));
                //读取来自服务器的反馈
                //InputStreamReader:字符输入流:读取服务器的内容
				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!");	
	}

}

3.运行

3.1 先启动服务器端 ,服务器会等待客户端客户端连接

?

3.2 启动客户端?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 18:38:23  更:2022-07-20 18:39:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/31 7:25:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码