接上一篇的内容,下面是TCP
编程的步骤:
TCP
分为客户端和服务端,其中:
- 客户端
- 创建
Socket
连接服务端(指定ip
地址,端口号)通过ip
地址找对应的服务器 - 调用
Socket
的getInputStream()
和getOutputStream()
方法获取和服务端相连的IO
流 - 输入流可以读取服务端输出流写出的数据
- 输出流可以写出数据到服务端的输入流
- 创建
- 服务端
- 创建
ServerSocket
(需要指定端口号) - 调用
ServerSocket
的accept()
方法接收一个客户端请求,得到一个Socket
- 调用
Socket
的getInputStream()
和getOutputStream()
方法获取和客户端相连的IO
流 - 输入流可以读取客户端输出流写出的数据
- 输出流可以写出数据到客户端的输入流
- 创建
客户端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws InterruptedException {
new TCPClient().start();
}
}
class TCPClient extends Thread {
@Override
public void run() {
Socket client = null;
BufferedReader read = null;
PrintStream write = null;
Scanner sc = new Scanner(System.in);
try {
// 客户端指向服务器的ip和端口,TCP连接必须准确
client = new Socket("127.0.0.1", 2332);
// 获得输入流并转成字符处理流,方便读取服务端返回的整行数据
read = new BufferedReader(new InputStreamReader(client.getInputStream()));
// 获得输出流并转成打印流,方便向服务端发送的整行数据
write = new PrintStream(client.getOutputStream());
// 从标准输入流读取一行字符发送到服务端,当输入内容为quit时结束
while (true) {
String line = sc.nextLine();
if (!line.equals("quit")) {
// 向服务器发送数据
write.println(line);
System.out.println("[Client] 正在发送:" + line);
// read.readLine()方法读取从服务器返回的一行数据
System.out.println("[Client] 发送成功:" + read.readLine());
}
}
} catch (IOException e) {
e.printStackTrace();
} finally { // 关闭相关的流
try {
sc.close();
read.close();
write.close();
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
服务端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
// 使用ServerSocket类绑定一个端口,客户端应和它一样
ServerSocket serverSocket = new ServerSocket(2332);
// 服务端应该是多线程的
while (true) {
// 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
Socket server = serverSocket.accept();
// 开始
new TCPServer(server).start();
}
}
}
class TCPServer extends Thread {
private Socket mServer;
TCPServer(Socket server) {
mServer = server;
}
@Override
public void run() {
try {
// 获得和客户端相连的输入输出IO流
BufferedReader read = new BufferedReader(new InputStreamReader(mServer.getInputStream()));
PrintStream write = new PrintStream(mServer.getOutputStream());
// 读取从客户端发来的一行字符串
String line = read.readLine();
if (line.equals("quit")) {
mServer.close();
}
System.out.println("[Server] 现在收到:" + line);
// 向客户端发送一行字符串
write.println(line + "已被Server收到");
} catch(IOException e) {
e.printStackTrace();
}
}
}
运行结果: