本文的代码详细注解使用AI生成
1、新建一个项目,再创建包,我这的包名为com.nyx.Test1
2、创建服务器类Server
package com.nyx.Test1;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(9898);
Socket s=ss.accept();
//服务器而言,不停地接收和发送数据
//启动的第一个线程负责接收数据
ReceThread rt=new ReceThread(s);
rt.start();//启动线程
System.out.println("服务器启动成功!");
//启动的第二个线程负责发送数据
SendThread st=new SendThread(s);
st.start();
}
}
3、创建客户端类Client
package com.nyx.Test1;
import java.io.IOException;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
Socket s=new Socket("localhost",9898);
//客户端而言,不停地接收和发送数据
//启动的第一个线程负责接收数据
ReceThread rt=new ReceThread(s);
rt.start();//启动线程
System.out.println("客户端启动成功并连接到服务器");
//启动的第二个线程负责发送数据
SendThread st=new SendThread(s);
st.start();
}
}
4、创建公共使用的发送类SendThread
下面是该类的核心功能以及相关的知识点:
-
构造函数:
SendThread(Socket s)
:这是一个构造函数,它接收一个Socket
对象作为参数,这个Socket
对象代表了客户端与服务器之间的网络连接。
-
run()
方法:public void run()
:这是线程启动后自动调用的方法。在这个方法中,线程将执行其主要的任务,即从用户输入读取消息并通过网络发送出去。
-
输入输出流:
OutputStream os = s.getOutputStream()
:这行代码从Socket
对象获取一个输出流,用于发送数据到网络对端。BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os))
:创建一个BufferedWriter
对象,它可以将文本数据写入到输出流中。OutputStreamWriter
用作装饰器,将字节流转换为字符流。
-
读取用户输入:
Scanner sc = new Scanner(System.in)
:创建一个Scanner
对象,用于从控制台读取用户的输入。
-
发送消息:
bw.write(sc.nextLine())
:将用户输入的文本写入到BufferedWriter
中。bw.newLine()
:写入一个新行字符,表示消息的结束。bw.flush()
:强制将缓冲区中的数据发送出去,确保消息被立即传输而不是等待缓冲区满。
-
异常处理:
catch (IOException e)
:捕获并处理在输入输出过程中可能发生的异常。
需要用到的知识点包括:
- 多线程编程:理解线程的创建和运行,以及线程的生命周期。
- Socket编程:了解如何使用Java的
Socket
类来建立网络连接和进行数据传输。 - I/O流:熟悉Java的输入输出流,包括字节流和字符流,以及如何使用缓冲流提高I/O性能。
- 异常处理:理解异常的概念,以及如何在Java中处理异常。
package com.nyx.Test1;
import java.io.IOException;
import java.io.OutputStream;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;
public class SendThread extends Thread {
private Socket s;
public SendThread(Socket s) {
this.s = s;
}
@Override
public void run() {
Scanner sc = new Scanner(System.in);
while(true) {
try {
OutputStream os = s.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write(sc.nextLine());
bw.newLine();
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
5、创建公共的接收类RaceThread
下面是该类的核心功能以及相关的知识点:
-
构造函数:
ReceThread(Socket s)
:这是一个构造函数,它接收一个Socket
对象作为参数,这个Socket
对象代表了客户端与服务器之间的网络连接。
-
run()
方法:public void run()
:这是线程启动后自动调用的方法。在这个方法中,线程将执行其主要的任务,即从网络接收数据并打印到控制台。
-
输入流:
InputStream is = s.getInputStream()
:这行代码从Socket
对象获取一个输入流,用于从网络对端接收数据。BufferedReader br = new BufferedReader(new InputStreamReader(is))
:创建一个BufferedReader
对象,它可以从输入流中读取文本数据。InputStreamReader
用作装饰器,将字节流转换为字符流。
-
接收消息:
String content = br.readLine()
:从BufferedReader
中读取一行文本数据。
-
打印接收到的消息:
System.out.println("接收到的数据是:"+content)
:将接收到的消息打印到控制台。
-
异常处理:
catch (IOException e)
:捕获并处理在输入输出过程中可能发生的异常。
需要用到的知识点包括:
- 多线程编程:理解线程的创建和运行,以及线程的生命周期。
- Socket编程:了解如何使用Java的
Socket
类来建立网络连接和进行数据传输。 - I/O流:熟悉Java的输入输出流,包括字节流和字符流,以及如何使用缓冲流提高I/O性能。
- 异常处理:理解异常的概念,以及如何在Java中处理异常。
package com.nyx.Test1;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class ReceThread extends Thread {
private Socket s;
public ReceThread(Socket s) {
this.s = s;
}
@Override
public void run() {
//不停的接收
while(true){
try {
InputStream is = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String content = br.readLine();
System.out.println("接收到的数据是:"+content);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
最后先启动服务器,再启动客户端来测试
测试成功!