文章目录
前言
客户端
服务器端
输出线程端
End
前言
TCP(Transmission Control Protocol)是一种面向连接的、可靠的网络传输协议,它提供了端到端的数据传输和可靠性保证。
本程序就是基于tcp协议编写而成的。
利用 TCP 协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序,两者的功能和编写方法大不一样。
代码结构图
在这里插入图片描述
客户端
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(System.in);
// 发送数据
// 创建 Socket对象
// 创建对象时会连接服务器,如果连接不上会报错
// 127.0.0.1 代表本机地址
Socket socket = new Socket("127.0.0.1", 11451);
MyThread thread = new MyThread();
OutputStream os = socket.getOutputStream();
while (true) {
if (thread.getState() == Thread.State.NEW) {
thread.setName("芜湖");
thread.setSocket(socket);
thread.start();
}
String str = in.next();
os.write(str.getBytes());
if ("886".equals(str)) {
socket.shutdownOutput();
break;
}
}
System.out.println("主线程退出");
in.close();
os.close();
socket.close();
}
}
服务器端
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
public static void main(String[] args) throws IOException, InterruptedException {
Scanner in = new Scanner(System.in);
// 接收数据
// 创建ServerSocket对象
ServerSocket ss = new ServerSocket(11451); // 获取指定端口的数据
MyThread thread = new MyThread();
Socket socket = ss.accept();// 监听客户端的连接,获取连接
OutputStream os = socket.getOutputStream(); // 获取输出流
while (true) {
// 判断该线程是否启动
if (thread.getState() == Thread.State.NEW) {
thread.setName("呀呼");
thread.setSocket(socket);
thread.start();
}
// 从连接通道中获取输出流
// 写出数据
String str = in.next();
os.write(str.getBytes());
// 结束
if ("886".equals(str)) {
socket.shutdownOutput();
break;
}
}
System.out.println("主线程退出");
in.close();
os.close();
socket.close();
ss.close();
}
输出线程端
import java.io.*;
import java.net.Socket;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class MyThread extends Thread {
Socket socket;
public void setSocket(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
while (true) {
BufferedInputStream isr = null; // 获取输出流
try {
isr = new BufferedInputStream(socket.getInputStream());
int len;
byte[] bytes = new byte[1024];
while ((len = isr.read(bytes)) != -1) {
String target = new String(bytes, 0, len);
// 获取当前时间
LocalDateTime dateTime = LocalDateTime.now(); // get the current date and time
// 按照相应格式解析
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-dd-MM HH:mm:ss");
// 输出当前时间
System.out.println(dateTime.format(formatter));
// 输出对方传输的内容
System.out.println(getName()+":"+target);
}
} catch (IOException e) {
break;
}
}
System.out.println(getName()+"输出线程退出");
}
End
此代码我已经测试过可以实现最初的无线数据传输,客户端运行在一个电脑上,服务器端运行在另一台电脑上,这时只需要将客户端的目标ip地址改为服务器端电脑的ip地址(如果不知到如何查询,win+r -> cmd->ipconfig,就可以看到自己电脑的IPv4 地址)。
需要注意的是,当时的测试环境是两台电脑处于同一个WiFi热点下进行的。