TCP通信整体过程:
1.【服务端】启动,创建ServerSocket对象,等待连接。
2.【客户端】启动,创建Socket对象,请求连接。
3.【服务端】接收连接,调用accept方法,并返回一个Socket对象。
4.【客户端】Socket对象,获取OutputStream,向服务端写出数据。
5.【服务端】Scoket对象,获取InputStream,读取客户端发送的数据。
客户端(发送数据)
1.创建Socket通信管道
2.获取IO流对象(输出)
3.写数据
4.释放资源
Socket socket = new Socket("IP地址",端口号);
OutputStream os = socket.getOutputStream();
os.write("需要写入的数据"); //可以进行流的增强
os.close();
服务端(接收数据)
1.创建ServerScoket通信管道
2.连接客户端Socket对象(监听方法)
3.获取IO流对象(输入)
4.读数据
5.释放资源
ServerSocket ss = new ServerSocket(端口号);
Socket socket = ss.accept();
InputStream is = socket.getInputStream();
int ch = is.read(); //可以进行流的增强
is.close();
记住就只有俩个点:建立通信管道获取输入输出流 + 同时写接收数据(易)和传输数据(涉及到键盘输入)
客户端代码:
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
/*
TCP通信 --2接收并反馈
* */
public class Client {
public static void main(String[] args) throws IOException {
System.out.println("===客户端启动===");
//1、创建Socket通信管道 并连接至服务端
Socket socket = new Socket(InetAddress.getLocalHost(),9999);
//2、通过Socket管道 获得一个字节输出流
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);//打印字节流就要将字节流os传参
Scanner sc = new Scanner(System.in);
while(true){
System.out.println("请输入信息:");
String msg = sc.nextLine();
ps.println(msg);
ps.flush();
//接收服务端反馈
BufferedReader bfr = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String Msg = bfr.readLine();
System.out.println("服务端返回信息:" + Msg);
}
}
}
服务端
package com.itheima.b02TCPTest2;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
public static void main(String[] args) throws IOException {
System.out.println("===服务端启动===");
//1、创建serversocket对象
ServerSocket ss = new ServerSocket(9999);
//2、通过socket通信管道 将监听信息返回
Socket socket = ss.accept();
//3、接收信息 收到的字节流 转换为字符流 再加上缓冲流
BufferedReader bfr = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//readLine 缓冲流读取的方法
String msg;
while((msg = bfr.readLine()) != null){
System.out.println(socket.getRemoteSocketAddress() + "发送信息:" + msg);
//服务端返回信息
System.out.println("请输入你想回复的信息:");
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
Scanner sc = new Scanner(System.in);
ps.println(sc.nextLine());
ps.flush();
}
}
}