TCP通信
TCP通信是严格区分客户端与服务器端 服务器端程序需要事先启动,等待客户端的连接
UDP中只有发送端和接收端,不区分客户端与服务器端
原理图:

实现TCP 服务器程序
* 表示服务器程序的类 java.net.ServerSocket
* 构造方法:
* ServerSocket(int port)传递端口号
* 很重要的事情:必须要获得客户端的套接字对象Socket
* Socket accept()
*
* 1,创建服务器ServerSocket对象(指定服务器端口号)
* 2,开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象
* 3,给客户端反馈信息
* 4,关闭流资源
package com.oracle.demo02;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class TCPServer {
//Tcp服务器端
public static void main(String[] args) throws IOException {
Scanner sc=new Scanner(System.in);
//创建服务器端对象,名确端口号
ServerSocket sever=new ServerSocket(9999);
while(true){
//创建连接
Socket socket=sever.accept();
//获取字节输入流来获取客户端数据
InputStream in=socket.getInputStream();
//创建字节数组接收数据
byte bytes[]=new byte[1024];
int len=in.read(bytes);
//获取客户端ip地址
String ip=socket.getInetAddress().getHostAddress();
System.out.println("ip地址为"+ip+"\t发送内容为"+new String(bytes,0,len));
//回复客户端
//获取字节输出流,准备给客户端写书据
OutputStream out=socket.getOutputStream();
//写出字节数组
out.write(sc.next().getBytes());
//释放资源
//sever.close();
}
}
}
实现TCP 客户端,连接到服务器
* 和服务器实现数据交换
* 实现TCP客户端程序的类 java.net.Soket
* 构造方法
* Socket(String host,int port) 传递服务器IP和端口号
* 注意:构造方法只要运行,就会和服务器进行连接,连接失败,抛出异常
* OutputStream getOutputStream() 返回套接字的输出流
* 作用:将数据输出,输出到服务器
* InputStream getInputStream() 返回套接字的输入流
* 作用:从服务器端读取数据
* 客户端服务器数据交换,必须使用套接字对象Socket中的获取的IO流,自己new流,不行
* 1,创建客户端Socket对象,(指定要连接的服务器地址与端口号)
* 2,获取服务器端的反馈回来的信息
* 3,关闭流资源
package com.oracle.demo02;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class TCOPlient {
public static void main(String[] args) throws UnknownHostException, IOException {
Scanner sc=new Scanner(System.in);
//创杰接收数组
byte bytes[]=new byte[1024];
while(true){
//创建客户端对象,来链接服务器
Socket socket=new Socket("127.0.0.1",9999);
//获取自己输出流,将数据传给服务器
OutputStream out=socket.getOutputStream();
//输出字节数组
out.write(sc.next().getBytes());
//接收服务器段回复
//获取字节输入流 接收服务器段回复
InputStream in=socket.getInputStream();
int len=in.read(bytes);
System.out.println(new String(bytes,0,len));
//释放资源
//socket.close();
}
}
}
文件上传原理图:
TCP上传服务器
- ServerSocket套接字对象,监听端口8888
- 方法accept()获取客户端的连接对象
- 客户端连接对象获取字节输入流,读取客户端发送图片
- 创建File对象,绑定上传文件夹
判断文件夹存在,不存在,再创建文件夹
- 创建字节输出流,数据目的File对象所在文件夹
- 字节读取图片,字节流将图片写入到目的文件夹中
- 将上传成功返回客户端
- 关闭资源
package com.oracle.demo04;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
import java.util.Scanner;
public class TCPServer {
//Tcp服务器端
public static void main(String[] args) throws IOException {
//创建服务器端对象,名确端口号
ServerSocket sever=new ServerSocket(9999);
//创建连接
Socket socket=sever.accept();
//获取字节输入流来获取客户端数据
InputStream in=socket.getInputStream();
//明确目的地
File file=new File("D:\\demo1018\\upload");
//判断该文件是否存在
if (!file.exists()) {
//如果不存在则创建文件夹
file.mkdirs();
}
String filename="oracle"+System.currentTimeMillis()+new Random().nextInt(6)+".txt";
//创建字节输出名
FileOutputStream fos=new FileOutputStream(file+file.separator+filename);
//创建字节数组接收数据
byte bytes[]=new byte[1024];
int len=0;
while((len=in.read(bytes))!=-1){
fos.write(bytes,0,len);
}
//获取客户端ip地址
//String ip=socket.getInetAddress().getHostAddress();
//System.out.println("ip地址为"+ip+"\t发送内容为"+new String(bytes,0,len));
//回复客户端
//获取字节输出流,准备给客户端写书据
OutputStream out=socket.getOutputStream();
//写出字节数组
out.write("上传成功".getBytes());
//释放资源
fos.close();
sever.close();
}
}
文件上传 客户端
实现步骤:
- Socket套接字连接服务器
- 通过Socket获取字节输出流,写图片
- 使用自己的流对象,读取图片数据源
FileInputStream
- 读取图片,使用字节输出流,将图片写到服务器
- 通过Socket套接字获取字节输入流
读取服务器发回来的上传成功
6.关闭资源
public void shutdownOutput() 禁用此Socket的输出流,间接的相当于告知了服务器数据写入完毕
package com.oracle.demo04;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class TCOClient {
//tcp客户端
public static void main(String[] args) throws UnknownHostException, IOException {
//创建客户端对象,来链接服务器
Socket socket=new Socket("127.0.0.1",9999);
//获取自己输出流,将数据传给服务器
OutputStream out=socket.getOutputStream();
//明确数据源
FileInputStream fis=new FileInputStream("D:\\demo1018\\print.txt");
//开始复制
//输出字节数组
int len=0;
//创杰接收数组
byte bytes[]=new byte[1024];
while ((len=fis.read(bytes))!=-1) {
out.write(bytes,0,len);
}
//告知服务器不要读了,结束
socket.shutdownOutput();
//接收服务器段回复
//获取字节输入流 接收服务器段回复
InputStream in=socket.getInputStream();
len=in.read(bytes);
System.out.println(new String(bytes,0,len));
//释放资源
fis.close();
socket.close();
}
}
浙公网安备 33010602011771号