网络编程--TCP编程

本文介绍了Socket的概念,它是通过TCP/IP协议进行网络通信的基础。Java的Socket类封装了操作系统接口,用于建立服务器端和客户端的TCP连接。通过一个简易聊天室的示例,详细讲解了如何使用ServerSocket创建服务器端,监听并接受客户端连接,以及如何编写Socket客户端程序进行通信。服务器端通过while循环不断接收客户端消息,并作出响应;客户端则通过字符输入输出流与服务器交互。
摘要由CSDN通过智能技术生成

一、什么是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 启动客户端 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值