文章目录
1.TCP客户端的操作步骤(client)
1.创建客户端的Socket对象
2.获取客户端所在的通道内字节输出流对象
3.写数据到通道的流中
4.释放资源
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author Cipher
* @date 2022/2/9 11:43
*/
public class TCPClient {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(10086);
System.out.println("服务器正在连接");
//2)监听客户端连接
//返回客户端对象
Socket socket = ss.accept() ;
System.out.println("客户端连接成功");
//获取监听到的客户端的通道内输入流对象
InputStream inputStream = socket.getInputStream();
//一次读取一个字节数组
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes) ;
//展示数据
String msg = new String(bytes,0,len) ;
//获取ip
String ip = socket.getInetAddress().getHostAddress() ;
System.out.println("来自"+ip+",发送的content是"+msg);
ss.close();
}
}
2.TCP服务端的实现步骤(Server)
1.创建服务端的Socket对象
2.监听客户端连接
3.获取通道内的字节输入流
3.读取通道内的数据(客户端写过来的数据)
5.展示数据,释放资源
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
/**
* @author Cipher
* @date 2022/2/9 11:42
*/
public class TCPServer {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("10.12.156.54",10086) ;
//2)获取客户端所在的通道内字节输出流对象
OutputStream outputStream = socket.getOutputStream() ;
//写数据
outputStream.write("你好!".getBytes());
//释放资源
socket.close();
}
}
运行时:先开启服务端,再开启客户端
3.客户端发送消息,服务器读消息并给客户端反馈数据
客户端代码实现:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
* @author Cipher
* @date 2022/2/9 15:38
* 客户端发送消息,服务器端读消息并给客户端反馈数据
*/
public class Client {
public static void main(String[] args) throws IOException {
//创建客户端的Socket
Socket socket = new Socket("10.12.156.35",6666) ;
//获取通道内的输出流对象
OutputStream outputStream = socket.getOutputStream() ;
//写数据
outputStream.write("你好,服务器端套接字".getBytes());
//获取通道内输入流对象,读取服务器端反馈的数据
InputStream inputStream = socket.getInputStream();
//一次读取一个字节数组
byte[] bytes = new byte[1024] ;
int length = inputStream.read(bytes) ;
String info = new String(bytes,0,length) ;
System.out.println("反馈的数据是:"+info);
//释放资源
socket.close();
服务端代码实现:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author Cipher
* @date 2022/2/9 15:37
*/
public class Server {
public static void main(String[] args) throws IOException {
//创建服务器的Socket对象
ServerSocket ss = new ServerSocket(6666);
System.out.println("服务器正在等待连接");
//监听客户端
Socket socket = ss.accept();
//获取通道内输入流对象
InputStream inputStream = socket.getInputStream();
//一次读取一个字节数组
byte[] bytes = new byte[1024] ;
int len = inputStream.read(bytes);
//获取ip
String ip = socket.getInetAddress().getHostAddress() ;
//获取数据
String data = new String(bytes,0,len) ;
//展示客户端发送的数据
System.out.println("数据来自-->"+ip+",它的内容是-->"+data) ;
//获取客户端所在的通道内的输出流对象
OutputStream out = socket.getOutputStream();
out.write("数据我已经收到了".getBytes());
//服务器端关闭资源
ss.close() ;
}
}
4.TCP相关练习
1)客户端不断的发送数据,服务端不断地展示数据
客户端程序----->服务端模拟真实场景,不需要关闭!
public class ClientTest {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("10.12.156.35",2333);
//创建键盘录入对象---->可以使用BufferedRead字符缓冲输入流 利用一次读取一行内容
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ; //读取录入的数据
System.out.println("请您输入一个数据:");
String line = null ;
//获取通道内的字节输出流OutputStream
//将通道的字节流--->封装字符缓冲输出流
//BufferedWriter(Writer out)
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())) ;
while((line=br.readLine())!=null){
//自定义结束条件
if("886".equals(line)){
break ;
}
bw.write(line) ; //将键盘录入的数据 写入到封装的通道内的bw流对象中
bw.newLine();
bw.flush();
}
//释放客户端资源
socket.close();
}
}
服务器端代码实现
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author Cipher
* @date 2022/2/9 16:20
*/
public class ServerTest {
public static void main(String[] args) throws IOException {
//服务器端不断的接收数据,展示出来
//创建服务器端的Socket
ServerSocket ss = new ServerSocket(2333) ;
//监听客户端
Socket socket = ss.accept();
//获取通道的内字节输入流
//封装通道内的字节输入流---->字符缓冲输入流
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())) ;
String line = null ;
while((line=br.readLine())!=null){
//展示数据
String ip = socket.getInetAddress().getHostAddress() ;
System.out.println("data from--->"+ip+",消息内容是-->"+line);
}
//服务器端不关闭
}
}
2)客户端读取一个当前项目下的文件,然后服务器端将文件内容展示在控制台上
客户端代码实现
import java.io.*;
import java.net.Socket;
/**
* @author Cipher
* @date 2022/2/9 17:42
* 2)客户端读取一个当前项目下的文件,然后服务器端将文件内容展示在控制台上
*/
public class clientTest2 {
public static void main(String[] args) throws IOException {
//创建客户端Socket对象
Socket socket = new Socket("10.12.156.35",5555);
//使用字符缓冲输入流读取当前项目的文件
//读文件
BufferedReader br = new BufferedReader(new FileReader("User.txt"));
//获取通过的字节输入流OutPutStream
//封装通道内的字节流:字符缓冲输出流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())) ;
//读写复制
String line = null;
while((line = br.readLine())!=null){
//写
bw.write(line);
bw.newLine();
bw.flush();
}
//关闭资源
br.close();
socket.close();
}
}
服务器端代码实现
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author Cipher
* @date 2022/2/9 17:43
*/
public class ServerTest2 {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(5555) ;
Socket socket = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line ;
while((line = br.readLine())!= null){
System.out.println(line);
}
ss.close();
br.close();
}
}
3)客户端读取一个当前项目下的文件,然后服务器端将文件复制到指定的文件中
客户端代码实现
import java.io.*;
import java.net.Socket;
/**
* @author Cipher
* @date 2022/2/9 19:13
* 3)客户端读取一个当前项目下的文件,然后服务器端将文件复制到指定的文件中
*/
public class ClientTest3 {
public static void main(String[] args) throws IOException {
//创建客户端Socket对象
Socket socket = new Socket("10.12.156.35",6666);
//创建字符缓冲输入流,读
BufferedReader br = new BufferedReader(new FileReader("user2.java")) ;
//封装通道内的字节流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())) ;
//读写复制
String line = null ;
while((line = br.readLine()) != null){
bw.write(line);
bw.newLine();
bw.flush();
}
// 客户端Socket提供 一个特有的方法:就是通知服务器端,没有流数据过去了!
//public void shutdownOutput()throws IOException
socket.shutdownOutput();
//客户端读取服务器端的反馈
//获取通道内的字节输入流
InputStream inputStream = socket.getInputStream();
//一次读取一个字节
byte[] bytes = new byte[1024] ;
int length = inputStream.read(bytes) ;
String info = new String(bytes,0,length) ;
System.out.println("客户端收到服务器端反馈的数据是:"+info);
//释放资源
br.close();
socket.close();
}
}
服务器端代码实现
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author Cipher
* @date 2022/2/9 19:30
* 服务器端将文件复制到指定的文件中
*/
public class ServerTest3 {
public static void main(String[] args) throws IOException {
//创建服务器端的Socket对象
ServerSocket ss = new ServerSocket(6666);
//监听客户端的连接
Socket socket = ss.accept();
//封装通道内的字节输入流
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())) ;
//封装目的地文件
BufferedWriter bw = new BufferedWriter(new FileWriter("user.txt")) ;
//读写复制
String line = null ;
while((line = br.readLine()) != null){
bw.write(line);
bw.newLine();
bw.flush();
}
OutputStream outputStream = socket.getOutputStream();
outputStream.write("文件复制完成".getBytes());
outputStream.flush();
//释放资源
bw.close();
ss.close();
}
}
4)TCP客户端读取当前项目下的高圆圆.jpg—服务器端将它复制到指定的图片文件中
import java.io.*;
import java.net.Socket;
/**
* @author Cipher
* @date 2022/2/9 20:14
* 1.TCP客户端读取当前项目下的高圆圆.jpg---服务器端将它复制到指定的图片文件中
*/
public class ClientTest4 {
public static void main(String[] args) throws IOException {
//客户端的套接字对象
Socket socket = new Socket("10.12.156.35",9876) ;
//创建字符缓冲输入流,读文件
// BufferedReader br = new BufferedReader(new FileReader("高圆圆.jpg")) ;
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("高圆圆.jpg")) ;
//创建字符缓冲输出流-->对通道内的字节输出流进行输出
// BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())) ;
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()) ;
//上面已经把传输准备好了,开始读写赋值
//一次读取一个字节数组
byte[] bytes = new byte[1024] ;
int len = 0 ;
while((len=bis.read(bytes))!=-1) {
bos.write(bytes, 0, len);
//刷新
bos.flush();
}
//判断是否还有流过来
socket.shutdownOutput();
//服务端对客户端进行反馈
InputStream inputStream = socket.getInputStream() ;//套结字获取反馈过来的内容
//读取
byte[] bytes1 = new byte[1024] ;
int length = inputStream.read(bytes1) ;
String info = new String(bytes1,0,length) ;
System.out.println(info);
socket.close();
bis.close();
}
}
文本文件,能用字符流,就用字符流
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author Cipher
* @date 2022/2/9 20:14
*/
public class ServerTest4 {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(9876) ;
//监听
Socket socket = ss.accept();
//封装通道内的字节输入流
//BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())) ;
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
//封装目的地文件
//BufferedWriter bw = new BufferedWriter(new FileWriter("杨桃.png")) ;
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("杨桃2.jpg")) ;
//读写复制
//一次读取一个字节数组
byte[] bytes = new byte[1024] ;
int len = 0 ;
while((len = bis.read(bytes))!=-1) {
//写入
bos.write(bytes, 0, len);
//强制刷新
bos.flush();
}
//加入反馈
//获取通道内的输出流
OutputStream out = socket.getOutputStream() ;
out.write("图片已经复制完毕".getBytes());
//刷新
out.flush();
//释放资源
bos.close();
socket.close();
}
}