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