0303 TCP
TCP是明确确定客户端和服务器端
JDK中提供了ServerSocket类,用于表示服务器端,Socket类,用于表示客户端
ServerSocket类
构造:ServerSocket(int port)明确服务器的端口号
类方法:accpet()该方法是创建与客户端的联系,返回值是一个socket对象
Socket类
构造:
Socket(String str,int port)
Socket (InetAddress address, int port)
常用类方法
getInputStream() 返回值是InputStream 对象
getOutputStream() 返回值是OutputStream 对象
代码展示 服务器端
public class TCPSever {
//服务器端
public static void main(String[] args) throws IOException {
Scanner sc=new Scanner(System.in);
//创建服务器端对象 明确端口
ServerSocket sever=new ServerSocket(9000);
//创建链接获取与我链接的客户端对象
Socket socket=sever.accept();
//获取字节输入流,接收客户端发送的数据
InputStream in=socket.getInputStream();
//创建字节数组
byte[] bytes=new byte[1024];
int len=in.read(bytes);
System.out.println("客户端发送的内容为:"+new String(bytes,0,len));
//回复客户端
///获取字节输出流 目的地是客户端
OutputStream out=socket.getOutputStream();
//回复数据
out.write(sc.next().getBytes());
//释放资源
sever.close();
}
}
代码展示客户端
public class TCPlient {
//客户端
public static void main(String[] args) throws UnknownHostException, IOException {
Scanner sc=new Scanner(System.in);
//创建客户端对象
Socket socket=new Socket("127.0.0.1",9000);
//获得字节输出流,目的地是服务器
OutputStream out=socket.getOutputStream();
//发送数据
out.write(sc.next().getBytes());
//接收服务器端的回复
//获取字节输入流
InputStream in=socket.getInputStream();
byte[] bytes=new byte[1024];
int len=in.read(bytes);
System.out.println("服务器端回复的数据为:"+new String(bytes,0,len));
//释放资源
socket.close();
}
}
运行结果

那么我们利用循环 将这个数据发送循环起来
代码展示客户端
public class TCPlient {
//ke客户端
public static void main(String[] args) throws UnknownHostException, IOException {
Scanner sc=new Scanner(System.in);
//创建客户端对象
Socket socket=new Socket("127.0.0.1",8888);
while(true){
//获取输出流
OutputStream out=socket.getOutputStream();
out.write(sc.next().getBytes());
//收到服务器端回复
//获取输入流
InputStream in=socket.getInputStream();
byte[] bytes=new byte[1024];
int len=in.read(bytes);
System.out.println("服务器端回复:"+new String(bytes,0,len));
}
//socket.close();
}
}
服务器端
public class TCPSrever {
//服务器端
public static void main(String[] args) throws IOException {
Scanner sc=new Scanner(System.in);
//创建服务器端对象
ServerSocket server=new ServerSocket(8888);
//创建链接
Socket socket=server.accept();
while(true){
//获取输入流
InputStream in=socket.getInputStream();
byte[] bytes=new byte[1024];
int len=in.read(bytes);
System.out.println("客户端发送数据为:"+new String(bytes,0,len));
//去客户端回复数据
//获取输出流
OutputStream out=socket.getOutputStream();
out.write(sc.next().getBytes());
}
//释放资源
//server.close();
}
}
运行结果

那我们利用这个数据传输功能实现文件上传功能
客户端
public class TCPlient {
public static void main(String[] args) throws UnknownHostException, IOException {
//创建客户端对象明确服务器端的ip和端口号
Socket socket=new Socket("127.0.0.1",8888);
//明确读取数据的数据源
FileInputStream fis=new FileInputStream("F:\\io1127\\3.jpg");
//明确目的地 获得字节输出流
OutputStream out=socket.getOutputStream();
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));
//释放资源
socket.close();
}
}
服务器端
public class TCPSever {
public static void main(String[] args) throws IOException {
//创建服务器对象 明确端口号
ServerSocket server=new ServerSocket(8888);
//与客户端链接 获取socket对象
Socket socket=server.accept();
//明确数据源
//读取客户端发送过来的数据
InputStream in=socket.getInputStream();
//明确目的地文件的位置
File file=new File("F:\\io1127\\server");
//如果文件夹不存在 就创建
if(!file.exists()){
file.mkdirs();
}
//明确文件名
String filename="oracle"+System.currentTimeMillis()+new Random().nextInt(9999)+".jpg";
//明确目的地
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);
}
//回复客户端
//获取字节输出流
OutputStream out=socket.getOutputStream();
//回复内容
out.write("收到".getBytes());
server.close();
}
}
TCP流程原理图解


浙公网安备 33010602011771号