需求一上传文件
这个练习的难点是服务端的while不能结束,要通过以下三种方式可以使服务端知道文件已经上传完毕
package com.tcp4;
import java.io.*;
import java.net.*;
import java.util.*;
public class client4 {
public static void main(String[] args)throws Exception {
Socket s=new Socket("192.168.1.103",10003);
//目的:服务端
BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
BufferedReader bufr=new BufferedReader(new FileReader("E:\\Circle.java"));
String line=null;
//第二种解决方式:时间戳(就是用时间作为结束标记,时间具有唯一性)
//做法:获取某个时间,然后告诉服务端,这个时间,后面的做法和方法一相同
DataOutputStream dos=new DataOutputStream(s.getOutputStream());
long l=System.currentTimeMillis();
dos.writeLong(l);
while((line=bufr.readLine())!=null)
{
bufw.write(line);
bufw.newLine();
bufw.flush();
}
//第三种做法(标准做法),
s.shutdownOutput();//关闭客户端的输出流,相当于给流中加了结束标记-1
//第一种解决方式:用特定字符作为结束标记,当服务器端读到over一行时,代表读完,跳出循环,继续后面的操作
/* 但是若用特定的字符,容易和待复制的数据重复
* bufw.write("over");
bufw.newLine();
bufw.flush();
*/
/*第二种方式(在输出流最后写时间戳,作为服务端读的结束标记)
bufw.write(l+"");
bufw.newLine();
bufw.flush();
*/
BufferedReader bufrS=new BufferedReader(new InputStreamReader(s.getInputStream()));
String str=bufrS.readLine();
System.out.println(str);
bufr.close();
s.close();
}
}
package com.tcp4;
import java.io.*;
import java.net.*;
import java.util.*;
public class server4 {
public static void main(String[] args)throws Exception {
ServerSocket ss=new ServerSocket(10003);
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+".....connect");
//从客户端读数据
BufferedReader bufr=new BufferedReader(new InputStreamReader(s.getInputStream()));
//写入文件中(而不是客户端了啊)
BufferedWriter bufw=new BufferedWriter(new FileWriter("e:\\copy.java"));
//第二种方式。从客户端获得时间戳
DataInputStream dis=new DataInputStream(s.getInputStream());
long l=dis.readLong();
String str=(l+"");
String line=null;
while((line=bufr.readLine())!=null)
{
//第一种解决方式
/*if("over".equals(line))
break;
*/
/*第二种方式
if(str.equals(line))
break;
*/
bufw.write(line);
bufw.newLine();
bufw.flush();
}
/* OutputStream out=s.getOutputStream();
byte[] buf="已经将文件复制成功哈哈哈哈".getBytes();
// System.out.println(buf.toString());
out.write(buf);
*/
BufferedWriter bufwS=new BufferedWriter (new OutputStreamWriter(s.getOutputStream()));
bufwS.write("数据复制成功");
bufwS.newLine();
bufwS.flush();
bufw.close();
s.close();
}
}
二、上传文件是以字符流方式上传的,下面以上传图片为例字节流演示
import java.io.*;
import java.net.*;
public class client5 {
public static void main(String[] args)throws Exception {
Socket s=new Socket("192.168.1.103",10011);
//读文件
FileInputStream fis=new FileInputStream("e:\\a.png");
//目的,服务端(写)
OutputStream out=s.getOutputStream();
int len=0;
byte[]buf=new byte[1024];
while((len=fis.read(buf))!=-1)
{
out.write(buf,0,len);
}
s.shutdownOutput();
BufferedReader bufr=new BufferedReader(new InputStreamReader(s.getInputStream()));
String str=bufr.readLine();
System.out.println(str);
fis.close();
s.close();
}
}
import java.io.*;
import java.net.*;
public class server5 {
public static void main(String[] args)throws Exception {
ServerSocket ss=new ServerSocket(10011);
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"......connected");
//从客户端读
InputStream in=s.getInputStream();
//写入磁盘中
FileOutputStream fos=new FileOutputStream("copy.png");
int len=0;
byte[] buf=new byte[1024];
while((len=in.read(buf))!=-1)
{
fos.write(buf,0,len);
}
BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bufw.write("图片复制完毕");
bufw.newLine();
bufw.flush();
fos.close();
s.close();
ss.close();
}
}
需求三
客户端通过键盘录入用户名。
服务端对这个用户名进行校验。
如果该用户存在,在服务端显示xxx,已登陆。
并在客户端显示 xxx,欢迎光临。
如果该用户存在,在服务端显示xxx,尝试登陆。
并在客户端显示 xxx,该用户不存在。
最多就登录三次。
import java.io.*;
import java.net.*;
public class client {
public static void main(String[] args)throws Exception {
Socket s=new Socket ("192.168.1.103",10008);
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
//写入服务器
BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//读取从服务器端返回的数据
BufferedReader bufrS=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line=null;
for(int x=0;x<3;x++)
{
System.out.println("请输入用户名");
line=bufr.readLine();
//写入服务器中
bufw.write(line);
bufw.newLine();
bufw.flush();
//判断是否登录成功
String info=bufrS.readLine();
System.out.println("infor"+info);
if(info.contains("欢迎光临"))
{
System.out.println(line+"该用户登陆成功");
break;
}
}
s.close();
}
}
import java.io.*;
import java.net.*;
public class server {
public static void main(String[] args)throws Exception {
ServerSocket ss=new ServerSocket(10008);
Socket s=ss.accept();
for(int x=0;x<3;x++)
{
//从客户端读
BufferedReader bufr=new BufferedReader(new InputStreamReader(s.getInputStream()));
//根据客户端数据读文件查询是否有这个人
FileReader fr=new FileReader("e:\\a.txt");
BufferedReader bfr=new BufferedReader(fr);
//对客户端反馈数据(写)
BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String name=bufr.readLine();
String line=null;
boolean flag=false;
while((line=bfr.readLine())!=null)
{
if(name.equals(line))
{
flag=true;
break;
}
}
if(flag)
{
System.out.println(name+"已登陆登陆");
bufw.write(name+"欢迎光临");
bufw.newLine();
bufw.flush();
bfr.close();
break;
}
else
{
System.out.println(name+"尝试登陆");
bufw.write(name+"该用户不存在");
bufw.newLine();
bufw.flush();
}
}
s.close();
ss.close();
}
}