前言

socket底层、原理这些东西一搜一堆,这里就不重点说这些了

这里主要以代码形式大体说一下步骤过程,直接以注释的形式表现出来了

实现

主要过程:

启动服务端 > 启动客户端 > 客户端主动向服务端发送请求 > 服务端返回结果 > 客户端再次发送请求 > 服务端再次返回结果……

代码

服务端Server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import java.io.*;
import java.net.*;
/**
* 服务端
*/
public class Server {
public static void main(String args[]) {
try{
ServerSocket server = null;
try{
// 创建一个ServerSocket,在端口6666监听客户请求
server = new ServerSocket(6666);
}catch(Exception e){
e.printStackTrace();
}
Socket socket=null;
try{
// 使用accept()阻塞等待客户请求,有客户
// 请求到来则产生一个Socket对象,并继续执行
socket=server.accept();
}catch(Exception e){
e.printStackTrace();
}
// 第一步:获取客户端发过来的消息
// 由Socket对象得到输入流,并构造BufferedReader对象
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

// 由Socket对象得到输出流,并构造PrintWriter对象
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());

// 控制台输入数据,构造BufferedReader对象
BufferedReader systemInBufferedReader = new BufferedReader(new InputStreamReader(System.in));

// 客户端所需要的数据(控制台输入)
String systemIn;
systemIn = systemInBufferedReader.readLine();

// 在标准输出上打印从客户端读入的字符串
System.out.println("客户端Client:"+bufferedReader.readLine());

// 如果发送给客户端bye,就终止循环
while(!systemIn.equals("bye")){

//第二步: 发送数据到客户端
printWriter.println(systemIn);
// 刷新输出流,使客户端Client马上收到该字符串
printWriter.flush();

// 从客户端发送过来的数据
System.out.println("Client:"+bufferedReader.readLine());

//第三步:客户端再次所需要的数据(控制台输入)
systemIn = systemInBufferedReader.readLine();
}

printWriter.close(); // 关闭Socket输出流
bufferedReader.close(); // 关闭Socket输入流
socket.close(); // 关闭Socket
server.close(); // 关闭ServerSocket
}catch(Exception e){
e.printStackTrace();
}
}
}

客户端Client

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.io.*;
import java.net.*;
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
try{
// 向127.0.0.1的6666端口发出客户请求
Socket socket = new Socket("127.0.0.1",6666);

// *由Socket对象得到输入流,并构造BufferedReader对象
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

// *由Socket对象得到输出流,并构造PrintWriter对象
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());

// 控制台输入数据,构造BufferedReader对象
BufferedReader systemInBufferedReader = new BufferedReader(new InputStreamReader(System.in));

// 第一次需要发送给服务端的数据(控制台输入)
String readline;
readline = systemInBufferedReader.readLine();

// 如果发送给服务端bye,就终止循环
while(!readline.equals("bye")){

//第一步:将数据发送给服务端 readline
printWriter.println(readline);
// 刷新输出流,使服务端Server马上收到该字符串
printWriter.flush();

//第二步:接收服务端来的数据bufferedReader.readLine()
System.out.println("服务端Server:" + bufferedReader.readLine());

//第三步:再次需要发送给服务端的数据(控制台输入)
readline = systemInBufferedReader.readLine();
}

printWriter.close(); // 关闭Socket输出流
bufferedReader.close(); // 关闭Socket输入流
socket.close(); // 关闭Socket
}catch(Exception e){
e.printStackTrace();
}
}
}