Java-TCP通信程序练习

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
ClientDemo:

package com.TCP;

import jdk.net.Sockets;

import java.io.*;
import java.net.Socket;


/*
* 练习1:客户端:发送数据,接收服务器反馈
* 练习2:客户端:数据来自于键盘录入,直到输入的数据是886,发送数据结束
* 练习3:客户端:数据来自于键盘录入,直到输入的数据是886,发送数据结束
* 练习4:客户端:数据来自于文本文件
* 练习5:客户端:数据来自于文本文件,接收服务器反馈
* 练习6:客户端:数据来自于文本文件,接收服务器反馈
* */
public class ClientDemo {
// //练习1
// public static void main(String[] args) throws IOException {
// //创建客户端的Socket对象(Socket)
// Socket s = new Socket("192.168.0.105", 10001);
//
// //获取输出流,写数据
// OutputStream os = s.getOutputStream();
// os.write("hello,TCP,我来了".getBytes());
//
// //接收服务器反馈
// InputStream is = s.getInputStream();
// byte[] bys = new byte[1024];
// int len = is.read(bys);
// String data = new String(bys, 0, len);
// System.out.println("客户端:" + data);
//
// //释放资源
// //is.close();
// //os.close();
// s.close();
// }

// //练习2、练习3
// public static void main(String[] args) throws IOException {
// //创建客户端Socket对象
// Socket s = new Socket("192.168.0.105", 10001);
//
// //数据来自于键盘录入,直到输入的数据是886,发送数据结束
// BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// //封装输出流对象
// BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
// String line;
// while ((line = br.readLine()) != null) {
// if ("886".equals(line)) {
// break;
// }
//
// //获取输出流对象
//// OutputStream os = s.getOutputStream();
//// os.write(line.getBytes());
// bw.write(line);
// bw.newLine();
// bw.flush();
// }
//
// //释放资源
// s.close();
// }

// //练习4、练习5
// public static void main(String[] args) throws IOException {
// //创建客户端Socket对象
// Socket s = new Socket("192.168.0.105",10001);
//
// //封装文本文件的数据
// BufferedReader br = new BufferedReader(new FileReader("MyNet\\s.txt"));
// //封装输出流写数据
// BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//
// String line;
// while((line = br.readLine()) != null){
// bw.write(line);
// bw.newLine();
// bw.flush();
// }
//
// //释放资源
// br.close();
// s.close();
// }

//练习5、练习6
public static void main(String[] args) throws IOException {
//创建客户端Socket对象
Socket s = new Socket("192.168.0.105",10001);

//封装文本文件的数据
BufferedReader br = new BufferedReader(new FileReader("MyNet\\s.txt"));
//封装输出流写数据
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

String line;
while((line = br.readLine()) != null){
bw.write(line);
bw.newLine();
bw.flush();
}
// //自定义结束标记,但有可能出现传输的文本中也有886导致传输不完整
// bw.write("886");
// bw.newLine();
// bw.flush();

//public void shutdownOutPut() Socket类提供的结束标记方法
s.shutdownOutput();

//接收反馈
BufferedReader brClient = new BufferedReader(new InputStreamReader((s.getInputStream())));
String data = brClient.readLine();
System.out.println("服务器的反馈:" + data);

//释放资源
br.close();
s.close();
}
}
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
ServerDemo:

package com.TCP;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/*
* 练习1:服务器:接收数据,给出反馈
* 练习2:服务器:接收到的数据在控制台输出
* 练习3:服务器:接收到的数据写入文本文件
* 练习4:服务器:接收到的数据写入文本文件
* 练习5:服务器:接收到的数据写入文本文件,给出反馈
* 练习6:服务器:接收到的数据写入文本文件,给出反馈,代码用线程封装,为每一个客户端开启一个线程
* */
public class ServerDemo {
// //练习1:
// public static void main(String[] args) throws IOException {
// //创建服务器端的Socket对象(ServerSocket)
// ServerSocket ss = new ServerSocket(10001);
//
// //监听客户端连接,返回一个Socket对象
// Socket s = ss.accept();
//
// //获取输入流,读数据,并把数据显示在控制台
// InputStream is = s.getInputStream();
// byte[] bys = new byte[1024];
// int len = is.read(bys);
// String data = new String(bys, 0, len);
// System.out.println("服务器:" + data);
//
// //给出反馈
// OutputStream os = s.getOutputStream();
// os.write("数据已经收到".getBytes());
//
// //释放资源
//// s.close();
// ss.close();
// }

// //练习2:
// public static void main(String[] args) throws IOException {
// //创建服务器Socket对象
// ServerSocket ss = new ServerSocket(10001);
//
// //监听客户端的连接,返回一个对应的Socket对象
// Socket s = ss.accept();
//
// //获取输入流
// BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
// String line;
// while ((line = br.readLine()) != null) {
// System.out.println(line);
// }
//
// //释放资源
// ss.close();
// }

// //练习3、练习4:
// public static void main(String[] args) throws IOException {
// //创建服务器Socket对象
// ServerSocket ss = new ServerSocket(10001);
//
// //监听客户端连接,返回一个对应的Socket对象
// Socket s = ss.accept();
//
// //接收数据
// BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
// //把数据写入文件
// //BufferedWriter bw = new BufferedWriter(new FileWriter("MyNet\\s.txt"));//练习3
// BufferedWriter bw = new BufferedWriter(new FileWriter("MyNet\\copy.java"));//练习4
//
//
// String line;
// while((line = br.readLine()) != null){
// bw.write(line);
// bw.newLine();
// bw.flush();
// }
//
// //释放资源
// bw.close();
// ss.close();
// }

// //练习5:
// public static void main(String[] args) throws IOException {
// //创建服务器Socket对象
// ServerSocket ss = new ServerSocket(10001);
//
// //监听客户端连接,返回一个对应的Socket对象
// Socket s = ss.accept();
//
// //接收数据
// BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
// //把数据写入文件
// //BufferedWriter bw = new BufferedWriter(new FileWriter("MyNet\\s.txt"));//练习3
// BufferedWriter bw = new BufferedWriter(new FileWriter("MyNet\\copy.java"));//练习4
//
//
// String line;
// while((line = br.readLine()) != null){
//// if("886".equals(line)){//解决相互等待,但还是可能出现文本中有886导致传输不完整
//// break;
//// }
// bw.write(line);
// bw.newLine();
// bw.flush();
// }
//
// //给出反馈
// BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
// bwServer.write("文件上传成功");
// bwServer.newLine();
// bwServer.flush();
//
// //释放资源
// bw.close();
// ss.close();
// }

//练习6:
public static void main(String[] args) throws IOException {
//创建服务器对象Socket对象
ServerSocket ss = new ServerSocket(10001);
while (true) {
//监听客户端连接,返回一个对应的Socket对象
Socket s = ss.accept();
//为每一个客户端开启一个线程
new Thread(new ServerThread(s)).start();
}

// ss.close();//一般来说服务器不关闭
}
}
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
ServerThread:

package com.TCP;

import java.io.*;
import java.net.Socket;

public class ServerThread implements Runnable {
private Socket s;

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

@Override
public void run() {
//接收数据写到文本文件
try {
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
//BufferedWriter bw = new BufferedWriter(new FileWriter("MyNet\\CopyThread.java"));
//解决名称冲突问题
int count = 0;
File file = new File("MyNet\\CopyThread[" + count + "].java");
while(file.exists()){
count ++;
file = new File("MyNet\\CopyThread[" + count + "].java");
}
BufferedWriter bw = new BufferedWriter(new FileWriter(file));

String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}

//给出反馈
BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bwServer.write("文件上传成功");
bwServer.newLine();
bwServer.flush();

//释放资源
s.close();

} catch (IOException e) {
e.printStackTrace();
}
}
}