- TCP通信程序的练习5
- BUG系列(重点)
- BUG1
- BUG2
- 正确的写法
- 客户端:数据来自文本文件,接受服务器反馈
- 服务器:接收的数据写入文本文件,给出反馈
- 出现的问题:程序一直等待
- 原因:读数据的方法是阻塞式的
- 解决的方法:自定义结束标记。使用shutdownOutput()方法(推荐)
如果用于整人那真的很恶心!
BUG1- ClientDemo类(客户端)
package Demo;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientDemo {
public static void main(String[] args) throws IOException {
//建立客户端
Socket sgs = new Socket(InetAddress.getByName("sgs").getHostAddress(), 1110);
//获取输出流,写数据,采取字符缓冲流(一次写入一行),接受服务器反馈
BufferedReader br = new BufferedReader(new FileReader("C:\LianXi\java1.txt"));
BufferedReader br1 = new BufferedReader(new InputStreamReader(sgs.getInputStream()));
String line, line2;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sgs.getOutputStream()));
//给出反馈信息
while (((line2 = br1.readLine()) != null)) {
System.out.println("服务器" + line2);
}
//释放资源
sgs.close();
}
}
- ServerDemo类(服务器)
package Demo;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
public static void main(String[] args) throws IOException {
//建立服务器
ServerSocket sk = new ServerSocket(1110);
//侦听此客户端套接字并建立连接
Socket sgs = sk.accept();
//获取输入流,读数据,并写入文本文件中
BufferedReader br = new BufferedReader(new InputStreamReader(sgs.getInputStream()));
BufferedWriter bw = new BufferedWriter(new FileWriter("c:\Lianxi\javaCopy.txt"));
String line;
while((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
//给客户端反馈信息
BufferedWriter bw1 = new BufferedWriter(new OutputStreamWriter(sgs.getOutputStream()));
bw1.write("已传输完成");
bw1.newLine();
bw1.flush();
//释放资源
sk.close();
}
}
- 输出的结果为:
- 原因:!!(一定要看!!!!!!!!!!)
- ClientDemo类(客户端)
package Demo;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientDemo {
public static void main(String[] args) throws IOException {
//建立客户端
Socket sgs = new Socket(InetAddress.getByName("sgs").getHostAddress(), 1110);
//获取输出流,写数据,采取字符缓冲流(一次写入一行),接受服务器反馈
BufferedReader br = new BufferedReader(new FileReader("C:\LianXi\java1.txt"));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sgs.getOutputStream()));
String line, line2;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
//自定义结束标记
bw.write("886");
bw.newLine();
bw.flush();
//给出反馈信息
BufferedReader br1 = new BufferedReader(new InputStreamReader(sgs.getInputStream()));
//给出反馈信息
while (((line2 = br1.readLine()) != null)) {
System.out.println("服务器" + line2);
}
//释放资源
sgs.close();
}
}
- ServerDemo类(服务器)
package Demo;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
public static void main(String[] args) throws IOException {
//建立服务器
ServerSocket sk = new ServerSocket(1110);
//侦听此客户端套接字并建立连接
Socket sgs = sk.accept();
//获取输入流,读数据,并写入文本文件中
BufferedReader br = new BufferedReader(new InputStreamReader(sgs.getInputStream()));
BufferedWriter bw = new BufferedWriter(new FileWriter("c:\Lianxi\javaCopy.txt"));
String line;
while((line=br.readLine())!=null) {
if ("886".equals(line)){
break;
}
bw.write(line);
bw.newLine();
bw.flush();
}
//给客户端反馈信息
BufferedWriter bw1 = new BufferedWriter(new OutputStreamWriter(sgs.getOutputStream()));
bw1.write("已传输完成");
bw1.newLine();
bw1.flush();
//释放资源
sk.close();
}
}
-
输出的结果为:
-
原因!!!(重点)
分析一:
分析二:
1
2
3
牵扯Socket类方法
| 方法名 | 说明 |
|---|---|
| void shutdownOutput(); | 禁用此套接字的输出流(说白点就是作为结束的标记发送给"服务器"让服务器识别后也结束自己的代码) |
ClientDemo类(客户端)
package Demo;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientDemo {
public static void main(String[] args) throws IOException {
//建立客户端
Socket sgs = new Socket(InetAddress.getByName("sgs").getHostAddress(), 1110);
//获取输出流,写数据,采取字符缓冲流(一次写入一行),接受服务器反馈
BufferedReader br = new BufferedReader(new FileReader("C:\LianXi\java1.txt"));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sgs.getOutputStream()));
String line, line2;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
// //自定义结束标记
// bw.write("886");
// bw.newLine();
// bw.flush();
//void shutdownOutput(); 禁用此套接字的输出流。
sgs.shutdownOutput();
//给出反馈信息
BufferedReader br1 = new BufferedReader(new InputStreamReader(sgs.getInputStream()));
//给出反馈信息
while (((line2 = br1.readLine()) != null)) {
System.out.println("服务器" + line2);
}
//释放资源
sgs.close();
}
}
ServerDemo类(服务器)
package Demo;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
public static void main(String[] args) throws IOException {
//建立服务器
ServerSocket sk = new ServerSocket(1110);
//侦听此客户端套接字并建立连接
Socket sgs = sk.accept();
//获取输入流,读数据,并写入文本文件中
BufferedReader br = new BufferedReader(new InputStreamReader(sgs.getInputStream()));
BufferedWriter bw = new BufferedWriter(new FileWriter("c:\Lianxi\javaCopy.txt"));
String line;
while((line=br.readLine())!=null) {//等待发送的数据
// if ("886".equals(line)){
// break;
// }
bw.write(line);
bw.newLine();
bw.flush();
}
//给客户端反馈信息
BufferedWriter bw1 = new BufferedWriter(new OutputStreamWriter(sgs.getOutputStream()));
bw1.write("已传输完成");
bw1.newLine();
bw1.flush();
//释放资源
sk.close();
}
}



