1 TCP
1.1 TCP简介
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 [1] 定义。 TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。
1.2 TCP连接方式
tcp连接方式俗称为"三次握手”即:
第一次 第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。 第二次 第二次握手:服务器收到syn包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。 第三次 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据。
2 代码实现
2.1 准备工作
2.1.1 查看本机IP地址
打开cmd命令提示符,输入ipconfig即可查看本机IP地址。
2.2 客户端
注意:Socket s = new Socket(“192.168.88.104”, 10005); IP地址为自己本机IP,端口号合适范围内即可,但端口号须与服务器端保持一致。
package tcp06;
import java.io.*;
import java.net.Socket;
public class ClientDemo06 {
public static void main(String[] args) throws IOException {
Socket s = new Socket("192.168.88.104", 10005);
BufferedReader br = new BufferedReader(new FileReader("L:\\Java\\tcp\\lcc.txt"));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
s.shutdownOutput();
BufferedReader brClient = new BufferedReader(new InputStreamReader(s.getInputStream()));
String data = brClient.readLine();
System.out.println("服务器反馈:" + data);
br.close();
bw.close();
}
}
2.3 服务器端
注意:ServerSocket ss = new ServerSocket(10005); 端口号须与客户端端保持一致
package tcp06;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo06 {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(10005);
while (true) {
Socket s = ss.accept();
new Thread(new ServerThread(s)).start();
}
}
}
通过实现Runnable接口的方法实现多线程
package tcp06;
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()));
int count = 0;
File file = new File("day01\\TX" + count + ".txt");
while (file.exists()) {
count++;
file = new File("day01\\TX" + count + ".txt");
}
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();
}
}
}
3 运行
3.1 运行操作
先打开服务器端,再打开客户端。
3.2 步骤运行
1.客户端先读取L:\Java\tcp\lcc.txt内容,然后写入数据发送给服务器端。 2.服务器端读取客户端发送的数据写入相应文件我写的是本模块day01下的路径),并给客户端发送反馈。 3.客户端接收并输出反馈。
3.3 运行截图
这是原本模块下的文件:
运行客户端
通过多线程执行多个客户端结果:
查看数据,OK没问题。
|