【服务端】
1、创建ServerSocket对象,绑定端口号;

2、创建死循环
   2.1 调用accept()方法一直等待客户端的连接
   2.2 创建线程,处理和客户端的通信

3、整体添加try catch 异常处理

------------------------------------------------------------------------------------------
【创建线程】
1、创建线程,实现implements接口
   1.1 私有化socket变量和构造方法

2、重写run方法
   2.1 通过socket对象获取流对象,进行数据的通信
       2.1.1 从客户端读取信息 输入流
       2.1.2 向客户端发送信息 输出流

3、创建while死循环
   3.1 阻塞方法,一直读取客户端的连接
   3.2 添加死循环的出口
   3.3 向客户端发送信息

4、释放资源 整体添加try catch异常处理

------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------

【客户端】
1、创建socket对象,指定链接的服务器ip地址和

2、创建输入输出流对象,进行数据交互
   2.1 创建输出流对象
   2.1 接收服务端的返回

3、创建while死循环
   3.1 等待用户从键盘输入 创建键盘扫描器
   3.2 向服务端发送信息
   3.3 接收服务端返回的信息

4、释放资源 整体添加try catch接口

【服务端】

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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TestTCPServerDemo {

public static void main(String[] args) {
try {
// 1.创建ServerSocket对象,绑定端口号
ServerSocket ss = new ServerSocket(6666);
// 2.调用accept()方法,等待客户端的连接,获取Socket对象
System.out.println("服务器端已经就绪,等待连接....");

//2.1添加死循环,一直接收客户端的连入请求
while(true){
Socket s = ss.accept();// 一直阻塞状态,一直等待客户端的连接
//2.2创建线程,处理和客户端的通信
ServerThread st = new ServerThread(s);
new Thread(st).start();
}
// ss.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("服务结束,请打分!");
}

}

}

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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class ServerThread implements Runnable {

private Socket s;

public ServerThread(Socket s) {
this.s = s;
}

@Override
public void run() {
try {
// 3.通过Socket对象获取流对象,进行数据的通信
// 从客户端读取信息
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintStream ps = new PrintStream(s.getOutputStream());
// 添加死循环,一直处理客户端的信息
while (true) {
String str = br.readLine();// 阻塞的方法,一直读取客户端的信息
System.out.println("客户端发来信息:" + str);
if ("886".equals(str)) {
break;// 提供死循环的出口,资源释放永远无法触及
}
// 向客户端回复信息
ps.println("echo--->" + str);
// 4.关闭Socket,释放资源
}
br.close();
ps.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}

【客户端】

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
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class TestTCPClientDemo {

public static void main(String[] args) {
try {
// 创建键盘扫描器
BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));

// 1.创建Socket对象,指定连接的服务器的ip地址和要连接的程序的端口号
Socket s = new Socket("192.168.14.250", 6666);

// 2.通过Socket对象获取流对象,进行数据的交互
// 创建输出流,指向服务器端的程序发送:halo zaima ?
PrintStream ps = new PrintStream(s.getOutputStream());
// 接收服务器返回的信息
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
while (true) {
System.out.println("请输入您 要发送的内容:");
String sendStr = br2.readLine();// 等待用户从键盘输入
ps.println(sendStr);
System.out.println("数据发送至服务器成功!");
//添加死循环的出口
if("886".equals(sendStr)){
break;
}
String result = br.readLine();
System.out.println("接受到服务器返回的信息:" + result);
}
// 3.关闭Socket释放资源
ps.close();
br.close();
s.close();
} catch (Exception e) {
e.printStackTrace();
}

}

}