------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
TCP协议案例
/*
* 需求:
* 服务端接收数据并写入文本文件,写入完毕后提示客户端文件上传完毕
* 用线程实现服务器端能够同时接收多个客户端的访问
*/
创建服务器接收文件的线程类
tcp协议传输数据
由于tcp传输需要建立连接,所以数据的传输都是在建立连接以后进行的,是在连接通道中传输的。所以服务器端一定要先开启。
接收数据:
A:创建接收端的Socket对象,指明端口号
ServerSocket(int port)
B:监听客户端连接。返回一个对应的Socket对象,以便得到对应的信息
public Socket accept()
C:通过返回的Socket对象获取输入流,读取数据显示在控制台
public InputStream getInputStream()
D:释放资源
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class ServerThread implements Runnable {
// 利用构造参数传递服务端获取的Socket对象
private Socket s;
public ServerThread(Socket s) {
this.s = s;
}
// 把获取到客户端Socket后的操作用线程实现
@Override
public void run() {
try {
// 获取通道输入流并封装
BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream()));
// 创建字符输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
// 读取数据并输出到文本文件
String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
// 获取通道输出流对象并封装
BufferedWriter bw2 = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));
// 输出提示到客户端
bw2.write("文件上传完毕");
bw2.flush();
// 释放资源
bw.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
创建服务器对象并开启服务器
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerTest {
public static void main(String[] args) throws IOException {
//创建服务端Socket对象
ServerSocket ss = new ServerSocket(22222);
//用循环获取客户端对象并开启线程
while(true){
Socket s = ss.accept();
new Thread(new ServerThread(s)).start();
}
}
}
客户端上传文件并读取服务器的反馈
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
/*
* 客户端读取文件发送到服务器,并读取服务器返回的提示
*/
public class UploadDemo {
public static void main(String[] args) throws IOException {
// 创建客户端对象
Socket s = new Socket("127.0.0.1", 22222);
// 获取并封装通道输出流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));
// 创建字符输入流对象
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
// 读取文本文件内容并输出到服务器
String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
// 客户端提示关闭管道输出流
s.shutdownOutput();
// 获取并封装通道输入流对象
BufferedReader br2 = new BufferedReader(new InputStreamReader(
s.getInputStream()));
//读取服务器返回的提示
String str = br2.readLine();
System.out.println(str);
// 释放资源
br.close();
s.close();
}
}