每天过得充实,你将不会焦虑
---同行者联盟
Socket
是一种规范(标准),封装了TCP协议的通信细节,使得我们使用它就可以完成与远端计算机的TCP链接,以及数据的传输。并且可以完成数据传输基于双向流的读写操作,Java语言里封装了Socket类,直接使用即可
客户端给服务端发送消息(写),服务端读到信息 (读) 以后发响应给客户端(写),客户端接收响应信息(读),所以客户端和服务端都具有读+写能力
做一个类似于聊天室的功能,分为以下3个步骤
1、客户端连接服务端
2、客户端成功给服务端发送消息,服务端接收消息
3、客户端给服务端发送消息,服务端接收消息后给出响应,客户端接收响应 (一人一句)
1、客户端连接服务端
客户端代码
public class SocketClient {
public static void main(String[] args) throws IOException {
System.out.println("开始连接");
// 创建网络连接对象,并指定访问地址+端口号,端口号不要乱指定,建议大家使用80系列
Socket socket = new Socket("localhost",8088);
System.out.println("连接成功!!!");
}
}
服务端代码
public class SocketServer {
public static void main(String[] args) throws IOException {
// 创建服务端对象,确定好接收的端口信息
ServerSocket serverSocket = new ServerSocket(8088);
System.out.println("等待客户端连接");
// 舰艇有没有客户端发请求给8088端口号,accept是阻塞方法,一直会监听客户端的连接,直到才客户端连接上为止
Socket socket = serverSocket.accept();
System.out.println("客户端已连接!!!");
}
}
注意⚠️:
运行时必须先运行服务端,举例说明,小明(客户端)给小红(服务端)打电话,但是前提必须是小红得有手机号,所以第一步是小红先申请电话号,第二步是小明打电话给小红,对应我们的代码是服务端先申请端口号,客户端才能给该host的端口发送连接请求
2、客户端给服务端发送消息,服务端能成功接收
客户端代码:
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class SocketClient {
Socket socket;
public SocketClient() {
System.out.println("开始连接");
// 创建网络连接对象,并指定访问地址+端口号,端口号不要乱指定,建议大家使用80系列,8080最容易被占用
try {
socket = new Socket("localhost", 8088);
} catch (IOException e) {
e.printStackTrace();
}
}
public void start(){
try {
System.out.println("客户端已启动");
OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream,"utf-8");
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
// 自动行刷新,即不会将缓冲区装满,按行刷新写数据
PrintWriter printWriter = new PrintWriter(bufferedWriter,true);
Scanner sc = new Scanner(System.in);
while(true){
String message = sc.nextLine();
printWriter.println(message);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
// 关流
}
}
public static void main(String[] args) {
SocketClient client = new SocketClient();
client.start();
}
}
服务端代码:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
ServerSocket serverSocket;
public SocketServer() {
// 创建服务端对象,确定好申请的端口号
try {
serverSocket = new ServerSocket(8088);
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
System.out.println("服务端已启动");
System.out.println("等待客户端连接");
try {
Socket socket = serverSocket.accept();
System.out.println("客户端已连接!!!");
// 从获取的客户端对象中,获取数据,前提是获取IO流
InputStream inputStream = socket.getInputStream();
// 转化为字符流
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
//为了更高效,我们可以加上缓冲流,而且BufferReader还可以按行读
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line = null;
while ((line = bufferedReader.readLine())!=null) {
System.out.println("客户端发来消息:"+line);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
// 关流
}
}
public static void main(String[] args) {
SocketServer socketServer = new SocketServer();
System.out.println("端口好已成功申请");
socketServer.start();
}
}
结果:
3、客户端与服务端正常交流(一人一句)
客户端代码
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class SocketClient {
Socket socket;
public SocketClient() {
System.out.println("开始连接");
// 创建网络连接对象,并指定访问地址+端口号,端口号不要乱指定,建议大家使用80系列,8080最容易被占用
try {
socket = new Socket("localhost", 8088);
} catch (IOException e) {
e.printStackTrace();
}
}
public void start(){
try {
System.out.println("客户端已启动");
OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream,"utf-8");
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
// 自动行刷新,即不会将缓冲区装满,按行刷新写数据
PrintWriter printWriter = new PrintWriter(bufferedWriter,true);
Scanner sc = new Scanner(System.in);
// 从获取的客户端对象中,获取数据,前提是获取IO流
InputStream inputStream = socket.getInputStream();
// 转化为字符流
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
//为了更高效,我们可以加上缓冲流,而且BufferReader还可以按行读
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line = null;
while(true){
String message = sc.nextLine();
printWriter.println(message);
line = bufferedReader.readLine();
if(line!=null){
System.out.println("服务端发来消息:"+line);
}
}
} catch (IOException e) {
e.printStackTrace();
}finally{
// 关流
}
}
public static void main(String[] args) {
SocketClient client = new SocketClient();
client.start();
}
}
服务端代码
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class SocketServer {
ServerSocket serverSocket;
public SocketServer() {
// 创建服务端对象,确定好申请的端口号
try {
serverSocket = new ServerSocket(8088);
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
System.out.println("服务端已启动");
System.out.println("等待客户端连接");
try {
Socket socket = serverSocket.accept();
System.out.println("客户端已连接!!!");
// 从获取的客户端对象中,获取数据,前提是获取IO流
InputStream inputStream = socket.getInputStream();
// 转化为字符流
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
//为了更高效,我们可以加上缓冲流,而且BufferReader还可以按行读
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream,"utf-8");
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
// 自动行刷新,即不会将缓冲区装满,按行刷新写数据
PrintWriter printWriter = new PrintWriter(bufferedWriter,true);
Scanner sc = new Scanner(System.in);
String line = null;
while ((line = bufferedReader.readLine())!=null) {
System.out.println("客户端发来消息:"+line);
printWriter.println(sc.nextLine());
}
} catch (IOException e) {
e.printStackTrace();
}finally{
// 关流
}
}
public static void main(String[] args) {
SocketServer socketServer = new SocketServer();
System.out.println("端口好已成功申请");
socketServer.start();
}
}
结果:
客户端结果截图:
服务端结果截图:
注意:
针对大学生的辅导班和准大学生的提前学
1) 对于面试而言,最重要的是算法和项目,现特邀P8大佬,哈工程研究生毕业者授数据结构与算法,带领大家学习300道经典算法题;
2) 项目课开始启动,带领大家领略企业中的项目流程
3) 暑假学习包括但不限于mysql、Java体系(语言、框架、javaWeb等)、C++、C语言、python语言、数据结构与算法、linux、redis;
4) 大数据的学习
有意向的可以沟通+V 17865578823